From: Shin-ichiro Hara Date: 1999-11-17T19:25:16+09:00 Subject: [ruby-list:18684] Re: paramclass 原です。 In message "[ruby-list:18566] Re: paramclass" on 99/11/13, GOTO Kentaro 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