作用域门:
在ruby中有三个门,Module门, Class门, def门,这里的门就是作用域的门。
看下面代码:
a1 = 1
class A //作用域门:进入Class门
a2 = 2
p local_variables
def hello //作用域门:进入def门
a3 = 3
p local_variables
end //作用域门:离开def门
end //作用域门:离开Class门
a = A.new
a.hello
p local_variables
结果:
[:a2]
[:a3]
[:a1, :a]
从上面我们看到了两个门一个是Class一个是def,这里我相应打出了各个作用域的局部变量,程序运行完回到了外部作用域,其实就是顶层作用域
那这里我就有个问题提问了,那如果在class和def中访问到外部的a1变量???
其实是可以办到的,我们分析下,为什么a1会访问不到,原因就是class门和def门挡住了,就像生活中我把门关上了你能进来吗??当然不会。
那如果我们把门去掉是不是就可以了,ruby是可以的,看如下代码:
a1 = 1
A = Class.new do
a2 = 2
p local_variables
define_method(:hello) do
a3 = 3
p local_variables
end
end
a = A.new
a.hello
p local_variables
输出结果:
[:a2, :a1, :a]
[:a3, :a2, :a1, :a]
[:a1, :a]
从结果来看其实不管是class里面还是def里面都有 a1变量了,说明都已经拿到了,其实我这里的做法就是去掉门,完成了上面的要求,
这里还用到了代码块,其实就是闭包,最后输出的时候并没有a2,a3,闭包是会打开和关闭,关闭的一瞬间,外部就访问不到,当然你可以修改闭包里面的变量值来达到修改外部变量的值,这里的module就不说了跟class类似。
总结:
module: 通过Module.new可以干掉module门 class: 通过Module.new可以干掉class门 def:
通过Module.new可以干掉def门 上面可以理解为扁平化作用域,压着压着就没了,也可以理解为共享作用域