在Ruby中的函数上调用call()

时间:2017-08-13 09:23:37

标签: 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, *args)
end

puts kall(sum, 2, 3)

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