我理解some_instance.send的概念,但我想弄明白为什么你可以把它称为两种方式。Ruby Koans暗示,除了提供许多不同的方法来做同样的事情之外,还有一些原因。下面是两个用法示例:
class Foo
def bar?
true
end
end
foo = Foo.new
foo.send(:bar?)
foo.__send__(:bar?)有谁知道这件事吗?
发布于 2011-01-11 21:57:41
一些类(例如标准库的socket类)定义了自己的与Object#send无关的send方法。因此,如果你想使用任何类的对象,你需要使用__send__来保证安全。
现在剩下的问题是,为什么会有send,而不仅仅是__send__。如果只有__send__,则名称send可以被其他类使用,而不会造成任何混淆。原因是send最先存在,直到后来人们才意识到send这个名称也可以在其他上下文中使用,所以添加了__send__ (顺便说一下,这与id和object_id发生的事情是一样的)。
发布于 2013-06-12 11:59:50
除了其他人已经告诉你的,以及归根结底说send和__send__是同一方法的两个别名之外,你可能会对第三种不同的可能性感兴趣,这就是public_send。示例:
A, B, C = Module.new, Module.new, Module.new
B.include A #=> error -- private method
B.send :include, A #=> bypasses the method's privacy
C.public_send :include, A #=> does not bypass privacy更新:由于Ruby2.1、Module#include和Module#extend方法成为公共方法,因此上面的示例将不再有效。
https://stackoverflow.com/questions/4658269
复制相似问题