在Ruby中对函数调用call()

在Ruby中对函数调用call(),ruby,Ruby,我的代码如下: def sum(a, b) a + b end puts sum.call 2, 3 我得到一个错误,比如: wrong number of arguments (given 0, expected 2) (ArgumentError) 如何调用函数 编辑 我希望有一个函数能够调用另一个具有特定参数的函数。我已经编写了如下代码,但仍然显示相同的错误 def sum(a, b) a + b end def kall(func, *args) send(func,

我的代码如下:

def sum(a, b)
  a + b
end

puts sum.call 2, 3
我得到一个错误,比如:

wrong number of arguments (given 0, expected 2) (ArgumentError)
如何调用函数

编辑

我希望有一个函数能够调用另一个具有特定参数的函数。我已经编写了如下代码,但仍然显示相同的错误

def sum(a, b)
  a + b
end

def kall(func, *args)
  send(func, *args)
end

puts kall(sum, 2, 3)

要调用函数
sum
,只需删除
.call
调用:

def sum(a, b)
  a + b
end

sum(1, 2)
# => 3 
调用该方法的其他方法是:

send(:sum,1,2)


它使用参数列表(1,2)在当前上下文/对象上调用方法
sum

调用方法的另一种方法是:

method(:sum).call(2, 3)
#=> 5

sum
不是一个函数,而是一个方法。方法属于对象,而不是对象。Ruby是一种面向对象的语言,这意味着您只能将对象存储在变量中,只能将对象作为参数传递(除了有点奇怪的块),只能从方法返回对象,只能向对象发送消息

您不能向
sum
方法发送消息,因为您只能向对象发送消息,而方法不是对象

即使可以将消息发送给方法,代码中仍然会有一个歧义:Ruby允许您在不传递任何参数的情况下将参数列表省略到消息发送中,因此

sum
是有效的消息发送,并且(在某种程度上)等同于(隐私模数)

因此,即使可以向方法发送消息,Ruby仍然会认为您尝试发送
sum
消息,而不使用参数列表

既然问题是我们需要一个对象,我们可以做两件事。首先,我们可以从一个对象开始

你在问题中使用了“函数”一词。Ruby没有函数,但它有一些类似的功能:s。一种解决方案是使用
Proc
代替方法:

sum = -> (a, b) { a + b }
sum.(2, 3)
#=> 5
另一个解决方案是为该方法获取一个对象。Ruby的反射系统有一个名为响应的类,其实例是方法的反射代理。您可以通过向对象发送消息来获取
方法
对象,例如:

sum = method(:sum)
sum.(2, 3)
#=> 5

如果方法是公共的,请使用
public\u send
而不是
send
。pass
:sum
(Symbol)而不是method
sum
使用kall(:sum,2,3)
。这非常有效。
调用
是多余的:)
方法(:sum)。(2,3)
。虽然正确,但请注意方法是Ruby中的对象。有一个类
Method
表示一个方法:)不,它们不是。您可以为方法获取反射代理对象,但它只是:代理。当我试图在一个方法中直接存储额外的元数据信息时,我学到了这一点。根据您获取
方法
对象的方式,您可能会也可能不会为同一方法获取多个不同的代理对象,显然,其中只有一个将包含存储在其中的数据。在最后一段中,我演示了如何为方法获取
方法
代理对象。
sum = method(:sum)
sum.(2, 3)
#=> 5