原です。
In message "[ruby-list:18566] Re: paramclass"
on 99/11/13, GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp> writes:
|
|ごとけんです
|> Bar = Foo(101, "baz")
|> bar1 = Bar.new
|> bar2 = Bar.new
|>とすればいいだけのことではないですか?もともとの姿からは少しずれる
|名前をつけるのがめんどくさいというのも作った理由だったりしま
|す。たとえばこういう用途を考えてます。
|
|Array_of(String)
|BoundedInteger(2**24)
|CommandProcess("ping")
|MultiDimentionalArray(1024,1024,2)
なるほど、すると a == b ならば Pclass(a) == Pclass(b) であってほしい訳ですね。
|>(話変わって)include されて時ではなく、extend された時呼ばれるメソッド
|>があると面白いと思うのだけど、どうかな。特異クラスがむき出しになるけど。
|
|それ自体は面白いんですけど、どんな用法がありますか??
単に append_features の「特異」版として考えたのです。include する所を
extend したらどうなるかなあと。でも extend_object を「特異的に使えば
いい」のだと気づきました。(^^;
こんな感じで。
-------^ cparam.rb
module ClassParameterizer
Parameters = {}
def Parameters.[](x)
klass, = x
unless r = super
r = self[x] = Class.new(klass)
r.module_eval do
include Default
extend Default
end
end
r
end
module Default
def default_parameters
Parameters.index(is_a?(Class) ? self : type)[1..-1]
end
end
def self.extend_object(klass)
super
cn = klass.name
eval "def #{cn}(*args); ClassParameterizer::Parameters[[#{cn}]+args] end",
TOPLEVEL_BINDING
end
end
### test
class Foo
end
Foo.extend ClassParameterizer
foo = Foo(0, "1").new
p Foo(0, "1").id == Foo(0, "1").id #=> true
p foo.is_a? Foo(0, "1") #=> ture
p foo.is_a? Foo #=> true
p foo.default_parameters #=> [0, "1"]
p Foo(0, "1").default_parameters #=> [0, "1"]
-------$ cparam.rb