在开发我自己的库的过程中,我一直在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)
没有贴在物体上会发生什么?在这种情况下,是否调用它所调用的类的方法?有人可以为我解释这段代码吗? :)
答案 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中,在没有显式接收器的情况下调用方法时,隐式接收器为self
。 self
有时候会变得很滑 - 了解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
定义的访问者。