Ruby中多个过程的执行顺序

时间:2016-03-15 01:24:05

标签: ruby proc

我正在尝试一个愚蠢的例子,以了解发送到方法的多个过程。然而,令我惊讶的一件事是执行的顺序。我查看了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执行从左到右执行。有人可以详细解释这种行为吗?

2 个答案:

答案 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