我有如下代码:
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
是有效的消息发送,并且(在某种程度上(等效于(模隐私(
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
你不需要做 .call 或类似的事情。如果函数没有参数,只需键入函数的名称。如果函数确实有参数,只需执行myFunction(param1, param2)
.
def hello
puts 'Hello, World!'
end
def output(string)
puts string
end
# Both of these do the same thing:
hello
hello()
# Doing that with stdout won't work though. It expects one argument, string
output('You can do it with parenthesis')
output 'You can also do it without'