我不明白以下两个代码示例之间的区别在哪里。第一个示例有一个 block 参数和一个 block 局部参数。第二个有两个 block 参数。我知道这两个 - block 和 block 局部参数 - 都有自己的范围。但是两者有什么区别呢?
x = 10
5.times do |y; x|
x = y
puts "x inside the block: #{x}"
end
puts "x outside the block: #{x}" # <-- gives 10
和
x = 10
5.times do |y, x|
x= y
puts "x inside the block: #{x}"
end
puts "x outside the block: #{x}" # <-- gives also 10
最佳答案
实际上是一样的。
但是从语义上讲,您的第二个示例是错误的:您将第二个参数 (x
) 传递给 #times
只需要一个,所以完全没有必要。只是当您将额外的参数传递给 block 时,Ruby 的设计不会提示。
但是,当您希望确保 block 中使用的变量不会意外地覆盖或引用 block 范围之外的变量时,您应该使用 block 局部参数,例如:
x = 10
5.times do |y|
x = 20
end
puts x # => 20
x = 10
5.times do |y; x|
x = 20
end
puts x # => 10
关于ruby - Ruby 中的 block 参数与 block 局部参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21114171/