Ruby中的`send`和`call`方法有什么区别?

12

我正在阅读一篇关于Ruby 1.9的文章。有很多使用Objectcall方法。

但是在最近版本的Ruby中,我得到了这个:

BasicObject.methods.include? :send # => true
BasicObject.methods.include? :call # => false
Object.methods.include? :call # => false

def foo
  puts 'text'
end

Object.send :foo # => text
Object.call :foo # => NoMethodError: undefined method `call' for Object:Class

我认为在某个版本的Ruby中(可能是1.9版),该方法被重命名了。但我不确定,请明确一下。


你的问题不够清晰。你认为哪个方法被重命名成了什么? - sawa
使用 Object。我已经编辑了问题。我认为从控制台日志中可以清楚地看出来。 - Mike Belyakov
仍然不清楚。 - sawa
我不记得Object上曾经定义过:call方法。你能同时发布一篇文章的链接吗? - Jokester
没错。http://nashbridges.me/procs-and-lambdas - Mike Belyakov
在链接文本中调用“call”的对象都是lambda和proc对象。 - sawa
1个回答

32
首先,sendcall 是两种非常不同的方法。
在 Ruby 中,面向对象编程的概念源自 Smalltalk。基本上,当您调用一个方法时,您正在向该对象发送一个消息。因此,当您想要在对象上动态调用方法时,您调用的方法是 send。自 1.8.7 版以来,这种方法就已经存在于 Ruby 中了。
在 Ruby 中,我们还有“块”的概念。块是附加到方法调用末尾的do...end。块可以传统地被 yield,或者可以将块创建成对象(一个Proc),并将其传递。为了执行块,可以在块上调用 callcall 从未在 Object 上定义过,而 send 在所有东西上都被定义过。
(注:由于某种原因,在 2.3.0 文档中似乎没有关于 call 的文档;但是,它仍然存在并且与 2.2.0 中的相同,因此我链接了那个文档。)

1
非常感谢您提供如此详尽清晰的答案!您解决了我所有的疑问。谢谢! - Mike Belyakov
@MikeBelyakov 没问题 :~) - Jeremy Rodi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接