2020-06-15
ブログ書いた。 最近わりとrbsコマンドを使ったり実装をいじったりしていることが多いので、人々がそれを使う時にスムーズにできるように知っていることを書いた。 自分がよく使う(そして他の人もよく使うであろう)prototype周りは記述が厚め。あとvalidateとかも便利そうなので上の方に書いた。
fork
がNotImplementedError
を投げるような環境ではrespond_to?(:fork)
はfalse
を返すらしい。
ただ、それと同様の挙動をRuby側で設定するようなAPIがないらしいので書いてみた。
module RespondToNotImp def __traverse(node, &block) block.call node node.children.each do |n| __traverse(n, &block) if n.is_a?(RubyVM::AbstractSyntaxTree::Node) end end def respond_to?(name, all = true) s = super(name, all) return false unless s ast = RubyVM::AbstractSyntaxTree.of method(name) __traverse(ast) do |node| return false if node.type == :CONST && node.children.first == :NotImplementedError end true end end class Object include RespondToNotImp end def foo raise NotImplementedError end p respond_to?(:foo)
手抜きなのでraise
はしてなくてもfalseが返ってしまう。
rbs v0.4.0がリリースされたから使いたかったのだけど、steepのバージョン指定に引っかかってしまって使えなかったのでPRを出した。
Mutex_m
moduleの型を足した。
Active Supportの型を書いていて必要になったので。