るりまから古いドキュメントを消すPRを投げた。
irbでBasicObject.newのようなinspectを持っていないオブジェクトを評価した時にエラーが出てしまっていたので直した。
delegate周りにPRしようかなーと眺めていたらREADMEのURLが間違っていたので直した。
RubyVM::AbstractSyntaxTree.ofは神機能という話。
delegateネタ2つ。
require 'delegate' class A def foo end end class B < DelegateClass(A) end class A def bar end end p B.instance_methods.include? :foo # => true p B.instance_methods.include? :bar # => false p B.public_instance_methods.include? :foo # => true p B.public_instance_methods.include? :bar # => true
このように、DelegateClassを呼んだ後に追加されたメソッドはinstance_methodsには含まれずにpublic_instance_methodsには含まれる。
なのでDelegateClassで作られるクラスでinstance_methodsも定義すると良さそう。
ちなみにこれは現実的には困ってない
require 'delegate' class A end class Object def foo p 'foo' end end class B < DelegateClass(A) end class Object def bar p 'bar' end end B.new(A.new).foo # => "foo" B.new(A.new).bar # => "bar" p B.instance_method(:foo) # ok p B.instance_method(:bar) # error
似たような状況で、DelegateClassを呼んだ後に追加されたメソッドは、呼べるけどメソッドオブジェクトを取れない。
あとはto_sとかも取れない。
なので、これを取れるようにするためにdelegate先のinstance_methodにfallbackしてメソッドオブジェクトを取れるようにすると便利なのではなかろうか。
ちなみに、これはrbs prototype runtimeでDelegateClassが出てくると破滅するのでちょっと困っている