Ruby`send` vs`call`方法

Mik*_*kov 5 ruby

我正在阅读一篇关于Ruby 1.9的文章.有很多的用途call与方法Object.

但是使用最新版本的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
Run Code Online (Sandbox Code Playgroud)

我认为在某些版本的Ruby(可能是1.9)中,方法被重命名.但我不确定.请说清楚.

Jer*_*odi 17

首先,sendcall是两个非常不同的方法.

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

在红宝石中,我们也有"块"的概念.块是do...end附加到方法调用结束的东西.传统上可以yield编辑块; 或者,完全可以从块(a Proc)中创建一个对象,然后传递它.为了执行该块,您可以调用call该块.

call从来没有被定义过Object,而是send在一切都被定义.

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