3.作用域和作用域门
1.class,module,def充当作用域门,作用域内部的local variable不能访问外部的local variable,反之亦然
2.区别块作用域,块内部可以访问块外部绑定的local variable,但是块外部不能访问块内部的local variable
3.区别块变量作用域,Ruby2.0之后的块变量不会改变局部变量的值
#示例代码:
v1 = 1
class MyClass #作用域门,进入MyClass
v2 = 2
local_variables #=>["v2"]
def my_method #进入作用域门,进入def
v3 = 3
local_variables
end #作用域门,离开def
local_variables #=>["v2"]
end #作用域门,离开class
obj = MyClass.new
obj.my_method
obj.my_method
puts local_variables #=>[:v1, :obj]
#class/module与def之间的差别
类和模块定义中的代码会被立即执行,方法定义中的代码只有方法被调用时才被执行。
#区别块变量作用域,Ruby2.0之后的块变量不会改变局部变量的值
x = 10
[1,3,3].each do |x|
puts x #其中这里的x是块变量x
end
x #=>10,这里的变量是局部变量x
#示例代码,块变量不会改变局部变量的值,但是块中的局部变量会改变绑定的值
y = 10
x = 10
[1,2,3].each do |x|
y = 11 #局部变量
x = 11 #虽然是局部变量的形式,但其实是块变量
end
puts y #11
puts x #10