diary

I like Hatena Star with a text selection.

2020-06-15

pocke.hatenablog.com

ブログ書いた。 最近わりとrbsコマンドを使ったり実装をいじったりしていることが多いので、人々がそれを使う時にスムーズにできるように知っていることを書いた。 自分がよく使う(そして他の人もよく使うであろう)prototype周りは記述が厚め。あとvalidateとかも便利そうなので上の方に書いた。


forkNotImplementedErrorを投げるような環境では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が返ってしまう。


github.com

rbs v0.4.0がリリースされたから使いたかったのだけど、steepのバージョン指定に引っかかってしまって使えなかったのでPRを出した。


github.com

Mutex_m moduleの型を足した。 Active Supportの型を書いていて必要になったので。