Ruby`send` vs`call`方法

我正在阅读一篇关于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)中,方法被重命名。 但我不确定。 请说清楚。

首先, sendcall是两种截然不同的方法。

在ruby中,面向对象的概念源于Smalltalk。 基本上,当您调用方法时,您正在向该对象发送 消息 。 因此,有意义的是,当您想要动态调用对象上的方法时,您调用的方法就是send 。 这种方法至少存在于ruby中1.8.7。

在ruby中,我们也有“块”的概念。 块是do...end附加到方法调用do...end东西。 块传统上可以yield ; 或者,完全可以从块( Proc )创建一个对象,并传递它。 为了执行该块,您可以在块上调用call

从未在Object上定义call ,而在所有内容上定义了send

(注意:出于某种原因, call似乎没有2.3.0文档中的文档;但是,它仍然存在并且在2.2.0中做同样的事情,所以我将它链接起来。)