diary

I like Hatena Star with a text selection.

2020-06-10

github.com

るりまから古いドキュメントを消すPRを投げた。


github.com

irbBasicObject.newのようなinspectを持っていないオブジェクトを評価した時にエラーが出てしまっていたので直した。


github.com

delegate周りにPRしようかなーと眺めていたらREADMEのURLが間違っていたので直した。


github.com

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 runtimeDelegateClassが出てくると破滅するのでちょっと困っている