Ruby`send` vs`call`方法

Ruby `send` vs `call` method

我正在读一篇关于Ruby1.9的文章。call方法与Object有很多用途。

但有了最新版本的Ruby,我得到了:

1
2
3
4
5
6
7
8
9
10
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,这是有意义的。这种方法至少从1.8.7开始就存在于Ruby中。

在Ruby中,我们还有一个"块"的概念。块是附加到方法调用末尾的do...end事物。传统上,块可以是yield到;或者,完全可以从块(Proc)中创建一个对象,并传递该对象。为了执行块,可以在块上调用call

call从来没有在Object上定义过,而send是在所有东西上定义的。

(注:由于某种原因,call似乎在2.3.0文档中没有文档;但是,它仍然存在,并且在2.2.0中执行相同的操作,因此我将其链接。)