0

独自のライブラリを開発する過程で、一般的なイディオムを理解するために、Github でさまざまな Ruby ライブラリを読んでいます。私が参照している 1 つのライブラリ (ここにあります) は、私が「添付されていない送信メソッド」と呼ぶものを活用しています。コードは次のとおりです。

module AngellistApi
    class API

        attr_accessor *Configuration::VALID_OPTIONS_KEYS

        # Creates a new API
        def initialize(options={})
          options = AngellistApi.options.merge(options)
          Configuration::VALID_OPTIONS_KEYS.each do |key|
            send("#{key}=", options[key])
          end 
        end
    end  
end 

Ruby の send メソッドに関してオンラインで見つけることができるすべてのドキュメントは、文字列またはシンボルを介してオブジェクトのメソッドを呼び出す方法として説明しています。ただし、すべての例では send メソッドがオブジェクトにアタッチされています。

object.send(:method_name, argument1)

オブジェクトにアタッチされていない場合はどうなりますか? この場合、内部で呼び出されたクラスのメソッドを呼び出していますか? 誰かが私のためにこのコードを説明できますか? :)

4

3 に答える 3

2

「アタッチされていない」というのは正しい用語ではありません。これは明示的な receiverのないメソッド呼び出しであるため、代わりに暗黙的な receiverを使用しselfます。したがってsend(:foo)、(暗黙の受信者) は (明示的な受信者) と同等self.send(:foo)です。これは に固有のものsendではなく、すべてのメソッド呼び出しに当てはまります。

この同等性が厳密に当てはまらないのは、呼び出されたメソッドがプライベートである場合のみです。これは、プライベート メソッドを明示的なレシーバーで呼び出すことができないためです (実際、これは Ruby でのプライベートの定義です)。

于 2012-11-24T21:16:23.390 に答える
1

インスタンスメソッド内で発生するため、ここでの暗黙のオブジェクトは ですself

# create a new object, assigning "foo = bar" given that
# foo is in VALID_OPTIONS_KEYS
object = AngellistApi::API.new({:foo => 'bar'})

# this would essentially do the same thing again
object.send("foo=", "bar")

# (which is equivalent to)
object.foo = bar
于 2012-11-24T21:07:11.163 に答える
0

一般的に言えば、Ruby では、メソッドが明示的なレシーバーなしで呼び出された場合、暗黙的なレシーバーはselfです。self時には滑りやすいこともあります --selfさまざまなコンテキストで何が起こっているかを理解することは、Ruby をマスターするための重要なステップであり、啓発的なステップです :-) Yehuda Katz はこのテーマについて素晴らしい記事を書いています

Pry の代替 REPLは探索に役立つと思います。AngelList API ライブラリがロードされたサンプル セッション:

[1] pry(main)> cd AngellistApi::API
[2] pry(AngellistApi::API):2> self
=> AngellistApi::API
[3] pry(AngellistApi::API):2> ls
Object.methods: yaml_tag
AngellistApi::API#methods: access_token  access_token=  adapter  adapter=  connection_options  connection_options=  endpoint  endpoint=  gateway  gateway=  proxy  proxy=  user_agent  user_agent=
locals: _  _dir_  _ex_  _file_  _in_  _out_  _pry_  binding_impl_method

ここでは、 の結果として定義されたアクセサーを確認できますattr_accessor *Configuration::VALID_OPTIONS_KEYS

于 2012-11-24T21:23:07.100 に答える