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