在Ruby中使用unattached发送方法的正确方法是什么?

时间:2012-11-24 21:01:34

标签: ruby

在开发我自己的库的过程中,我一直在Github上阅读各种Ruby库来理解常见的习语。我引用的一个库(found here)利用了我称之为“独立的发送方法”。这是代码:

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)

没有贴在物体上会发生什么?在这种情况下,是否调用它所调用的类的方法?有人可以为我解释这段代码吗? :)

3 个答案:

答案 0 :(得分:2)

“Unattached”不是正确的术语,它是没有显式接收器的方法调用,因此它使用隐式接收器,即{{1 }}。所以self(隐式接收器)等同于send(:foo)(显式接收器)。这不是self.send(:foo)所特有的,并且适用于任何方法调用。

这个等价的唯一时间不是严格正确的,因为调用的方法是私有的,因为私有方法不能用显式接收器调用(实际上,这是Ruby中私有的定义)。

答案 1 :(得分: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

答案 2 :(得分:0)

一般来说,在Ruby中,在没有显式接收器的情况下调用方法时,隐式接收器为selfself有时候会变得很滑 - 了解self在各种情况下的含义是Ruby掌握之路上的一个重要且有启发性的步骤:-) Yehuda Katz有a nice article这个主题,那里有many others

我认为the Pry alternative REPL可以帮助您进行探索。加载AngelList API lib的示例会话:

[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定义的访问者。