怎么' .call'方法是由Ruby中的返回整数触发的?

时间:2018-06-06 15:34:32

标签: ruby

我遇到了一个代码kata,它要求实现一个add(n)方法,该方法可以链接多个数字,然后将它们相加,例如:

add(1).(2).(3).(4).(5);  # => 15

当我刚开始使用时,我认为它可能涉及method_missing方法,因此我首先制作了一个简化版本,以便了解当我在链接*args之后如何处理.(n)返回一个整数的方法,我选择rand来执行此操作。

def method_missing(m, *args)
  p m
  p args
end

> rand(10).(9).(8)
# some other methods add empty array
:call
[9]
:call
[8]
 => [8]

然后我发现以下链式.(n)只调用.call方法并将n作为参数。基于another similar question,我只需重写call中的class Integer方法:

class Integer
  def call(x)
    self + x
  end
end


def add(n)
  n
end

然后我得到了结果。

问题是我知道.call方法通常会发送到Proc object。但是这里add(n)(以及rand和其他返回整数的方法)只是返回一个整数。

为什么这会触发call方法?我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

.()只是.call()的快捷方式是的,调用方法通常用于运行proc对象,但这并不会使它变得特别,只是proc对象具有的常规方法实现。如果您将其定义为执行其他操作,则快捷方式仍可正常工作