我的代码如下:
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)
答案 0 :(得分:5)
要调用sum
功能,只需删除.call
来电:
def sum(a, b)
a + b
end
sum(1, 2)
# => 3
调用该方法的其他方法是:
send(:sum, 1, 2)
使用参数列表(1,2)在当前上下文/对象上调用方法sum
。
答案 1 :(得分:2)
调用方法的另一种方法是:
method(:sum).call(2, 3)
#=> 5
答案 2 :(得分:1)
sum
不是函数,而是方法。方法属于对象,它们不是对象。 Ruby是一种面向对象的语言,这意味着你只能将对象存储在变量中,只能将对象作为参数传递(块略有奇怪的例外),只返回方法中的对象,只发送消息给对象。
您无法向sum
方法发送消息,因为您只能向对象发送消息,而方法不是对象。
即使它 可以向方法发送消息,代码仍然存在歧义:如果你没有&#39,Ruby允许你将参数列表遗漏给消息发送; t传递任何参数,因此
sum
是有效的消息发送,并且(某种程度上)等同于(模数隐私)
self.sum()
所以,即使如果可以向方法发送消息,Ruby也仍然认为你试图发送没有参数列表的sum
消息
因此,问题在于我们需要一个对象,我们可以做两件事。首先,我们可以使用一个对象开始。
您使用了术语"功能"在你的问题。嗯,Ruby没有功能,但它有一些接近它的东西:Proc
s。一种解决方案是使用Proc
而不是方法:
sum = -> (a, b) { a + b }
sum.(2, 3)
#=> 5
另一种解决方案是获取该方法的对象。 Ruby的反射系统有一个名为Method
的类,它响应call
,其实例是方法的反射代理。您可以通过向对象发送Object#method
消息来获取Method
对象,例如:
sum = method(:sum)
sum.(2, 3)
#=> 5