我遇到了一个代码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
方法?我错过了什么吗?
答案 0 :(得分:3)
.()
只是.call()
的快捷方式是的,调用方法通常用于运行proc对象,但这并不会使它变得特别,只是proc对象具有的常规方法实现。如果您将其定义为执行其他操作,则快捷方式仍可正常工作