Ruby 中多个过程的执行顺序
Order of execution for multiple procs in Ruby
我正在尝试一个愚蠢的例子来了解发送到一个方法的多个过程。但是,令我惊讶的一件事是执行顺序。我查看了 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 执行似乎是从左到右执行的。有人可以详细解释这种行为吗?
只是因为您将它们放在同一行上,所以 b.call 被作为 a.call 的参数调用。为了使它按您期望的方式工作;
def my_block(a, b)
a.call
b.call
end
这是因为:
a.call b.call
真的是:
a.call(b.call())
所以 b.call()
首先像在任何其他编程语言中一样展开(和 运行),然后将其结果作为参数传递给 a
。
您希望这会产生错误,但是在 Ruby 中,块的额外参数不会导致错误(尽管这是方法的错误)...
您可以使用分号明确告诉 ruby 开始一个新表达式:
a.call; b.call
...但我会说这很不合常理而且 "un-Ruby"...
我正在尝试一个愚蠢的例子来了解发送到一个方法的多个过程。但是,令我惊讶的一件事是执行顺序。我查看了 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 执行似乎是从左到右执行的。有人可以详细解释这种行为吗?
只是因为您将它们放在同一行上,所以 b.call 被作为 a.call 的参数调用。为了使它按您期望的方式工作;
def my_block(a, b)
a.call
b.call
end
这是因为:
a.call b.call
真的是:
a.call(b.call())
所以 b.call()
首先像在任何其他编程语言中一样展开(和 运行),然后将其结果作为参数传递给 a
。
您希望这会产生错误,但是在 Ruby 中,块的额外参数不会导致错误(尽管这是方法的错误)...
您可以使用分号明确告诉 ruby 开始一个新表达式:
a.call; b.call
...但我会说这很不合常理而且 "un-Ruby"...