るりまから古いドキュメントを消す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
が出てくると破滅するのでちょっと困っている