我正在尝试一个愚蠢的例子,以了解发送到方法的多个过程。然而,令我惊讶的一件事是执行的顺序。我查看了Proc文档,但没有真正找到解释(可能我看起来不够仔细)。
以下是一个例子:
def my_block(a, b)
a.call b.call
end
a = Proc.new { puts "hello" }
b = Proc.new { puts " world" }
my_block a, b
输出:
world
hello
似乎在一行上给出多个proc时,proc执行从左到右执行。有人可以详细解释这种行为吗?
答案 0 :(得分:3)
这是因为:
a.call b.call
真的是:
a.call(b.call())
因此,b.call()
首先得到扩展(并运行),就像在任何一种编程语言中一样,并将其结果作为参数传递给a
。
你希望这会产生错误,但是在Ruby中,对块的额外参数不会导致错误(但是对于方法来说这是一个错误)......
您可以使用分号明确告诉ruby启动一个新表达式:
a.call; b.call
...但我会说这是非常单一的和“非Ruby”...
答案 1 :(得分:2)
这只是因为你将它们放在同一行上,所以b.call被称为a.call的参数。为此,您可以按预期工作;
def my_block(a, b)
a.call
b.call
end