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

  • 本文关键字:调用 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, *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 没有函数,但它有一些接近它的东西:Procs。一种解决方案是使用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'

最新更新