2014-01-14 32 views
1

我不明白以下两个代码示例之间的区别在哪里。第一个例子有一个块参数和一个块本地参数。第二个有两个块参数。我明白,块和块本地参数 - 都有自己的范围。但是两者有什么区别?块参数与红宝石块本地参数

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 

回答

5

实际上它是相同的。

语义但是,你的第二个例子是错误的:你传递过程只需要一个第二个参数(x)到#times,所以它是完全不必要。只是当你将额外的参数传递给块时,Ruby设计并不会抱怨。

然而,你应该使用块局部参数,当你想在该块用于确保变量做块的范围,如外界不小心覆盖或引用变量:

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