ruby - Ruby 中的 block 参数与 block 局部参数

标签 ruby block

我不明白以下两个代码示例之间的区别在哪里。第一个示例有一个 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/

相关文章:

ruby - 使用 Nokogiri::XML::Builder 忽略空节点的最干净的方法是什么

ruby - 为什么实例变量在 block 内时似乎消失了?

objective-c - 我是否应该在对象指针上使用 __block 说明符,即使它在没有它的情况下也能工作?

ruby-on-rails - 为什么 Rails 的 `HashWithIndifferentAccess` 将键存储为字符串而不是符号?

ruby - instance_eval 和单例方法的区别

html - 内联图像和堆叠

ruby - 使用 block 创建哈希 (Ruby)

html - 在 IE 中使用对齐文本对齐的容器

ruby - 将 "2015-03-18 22:00"转换为 Time 对象的最佳方法

ruby-on-rails - 我应该使用 Redis 哈希还是 Ruby 哈希?