1. ホーム
  2. ruby

[解決済み] Ruby send と __send__ の比較

2022-04-22 18:03:56

質問

のコンセプトは理解しています。 some_instance.send が、なぜこれを両方の方法で呼べるのか、その理由を考えています。Rubyの公案では、同じことをするためにたくさんの異なる方法を提供する以上の理由があることを暗示しているのです。以下は2つの使用例です。

class Foo
  def bar?
    true
  end
end

foo = Foo.new
foo.send(:bar?)
foo.__send__(:bar?)

どなたかお分かりになる方はいらっしゃいますか?

解決方法は?

いくつかのクラス(例えば標準ライブラリのソケットクラス)は、独自の send とは無関係のメソッドです。 Object#send . したがって、任意のクラスのオブジェクトを操作したい場合は __send__ を使えば、安全面でも安心です。

さて、ここで疑問が残るのは、なぜ send でなく、単に __send__ . もし __send__ 名前 send は、他のクラスが混乱することなく使用することができました。その理由は send という名前が先に存在し、後になってから send は他の文脈でも有用に使えるかもしれないので __send__ が追加されました(これは idobject_id ちなみに)。