我得到以下不同的结果:
测试1:
def myblock
x = 1
y = 1
yield(x)
[x, y]
end
myblock do |x|
y = 10
end
# => [1,1]
测试2:
x = 1
y = 1
1.upto(2) do |x|
y = 20
end
[x,y]
# => [1,20]
块外部创建的变量可在块中使用。他们为什么这样?
答案 0 :(得分:2)
这就是如何定义局部变量的范围。局部变量可以渗透到块中,但不能渗透到方法定义中。
答案 1 :(得分:1)
def myblock
x = 1
y = 1
z = yield(x)
puts "y=#{y}, z=#{z}"
[x, y]
end
myblock do |x|
y = 10
end
y=1, z=10
#=> [1, 1]
这表明这里发生了三件事:
y
与y
中的myblock
无关。这是因为块中y
的范围仅限于块。 Ruby只能接触块所返回的内容,而不是内部发生的内容。y
的值,但仅仅因为y = 10
是块中执行的最后一个语句。该语句的执行返回10
,因此块返回10
。如果该块包含y = 10; 7
,则会返回7
。yield(x)
中的变量y
未捕获myblock
的值,因此无效。 1 。1一个鲜为人知的事实是,Ruby实际上将这些价值观射入外太空。
答案 2 :(得分:0)
经过更多测试和搜索:
对于Test1,x和y是方法级局部变量,它们不与块共享作用域。块中的y是一个新的局部变量(块级别)。
对于Test2,x和y是类级局部变量,它们与块共享范围,块中的y仍然是外部y(类级别)。
这一切都是因为我搞砸了范围,谢谢大家。