首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby send vs __send__

Ruby send vs __send__
EN

Stack Overflow用户
提问于 2011-01-11 21:48:02
回答 2查看 23.2K关注 0票数 174

我理解some_instance.send的概念,但我想弄明白为什么你可以把它称为两种方式。Ruby Koans暗示,除了提供许多不同的方法来做同样的事情之外,还有一些原因。下面是两个用法示例:

代码语言:javascript
复制
class Foo
  def bar?
    true
  end
end

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

有谁知道这件事吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-11 21:57:41

一些类(例如标准库的socket类)定义了自己的与Object#send无关的send方法。因此,如果你想使用任何类的对象,你需要使用__send__来保证安全。

现在剩下的问题是,为什么会有send,而不仅仅是__send__。如果只有__send__,则名称send可以被其他类使用,而不会造成任何混淆。原因是send最先存在,直到后来人们才意识到send这个名称也可以在其他上下文中使用,所以添加了__send__ (顺便说一下,这与idobject_id发生的事情是一样的)。

票数 267
EN

Stack Overflow用户

发布于 2013-06-12 11:59:50

除了其他人已经告诉你的,以及归根结底说send__send__是同一方法的两个别名之外,你可能会对第三种不同的可能性感兴趣,这就是public_send。示例:

代码语言:javascript
复制
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#includeModule#extend方法成为公共方法,因此上面的示例将不再有效。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4658269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档