いまいです。
$ ruby -ve'
module M
def self.append_features(klass)
self.public_instance_methods(false).each do |name|
method = self.instance_method(name)
klass.__send__(:define_method, name, method)
end
super
end
def m1(a, b, c)
[a, b, c]
end
def m2(*a)
a
end
end
p M.instance_method(:m1).arity
p M.instance_method(:m2).arity
class C
include M
end
p C.public_instance_methods(false)
p C.instance_method(:m1).arity
p C.instance_method(:m2).arity
c = C.new
p c.m1(:a, :b, :c)
p c.m2(:a, :b, :c)
p c.m1(:a, :b)
'
ruby 1.8.3 (2005-06-23) [i386-linux]
3
-1
["m2", "m1"]
1 #<= ???
1 #<= ???
[:a, :b, :c]
[:a, :b, :c]
-e:34:in `m1': wrong number of arguments (2 for 3) (ArgumentError)
from -e:34
のように、arity が必ず(?) 1 を返してしまうようです。呼び出しはふつうに
できますし、引数の数を間違えると、ちゃんと怒られます。何がしたいかとい
うと、XMLRPC::iPIMethods がクラスで定義されたメソッドしか公開してくれ
なくなった(<= 本来の動作です)ので、モジュールを include するタイミング
で強引に「クラスで定義されてること」にしてしまおう、というわけです。最
初に arity をチェックしてるみたいで、現状だと m2 にように * で受けて、
引数が一つの場合しかうまくいきません :-(。
--
Nobuhiro IMAI <nov / yo.rim.or.jp>
Key fingerprint = F39E D552 545D 7C64 D690 F644 5A15 746C BD8E 7106