module 和 class 和 def (作用域门)

来源:互联网 发布:红帽linux 10天就重启 编辑:程序博客网 时间:2024/06/03 08:11

作用域门:
在ruby中有三个门,Module门, Class门, def门,这里的门就是作用域的门。
看下面代码:

a1 = 1class A                        //作用域门:进入Class门    a2 = 2    p local_variables    def hello                  //作用域门:进入def门        a3 = 3        p local_variables    end                        //作用域门:离开defend                            //作用域门:离开Classa = A.newa.hellop local_variables

结果:

[:a2][:a3][:a1, :a]

从上面我们看到了两个门一个是Class一个是def,这里我相应打出了各个作用域的局部变量,程序运行完回到了外部作用域,其实就是顶层作用域

那这里我就有个问题提问了,那如果在class和def中访问到外部的a1变量???

其实是可以办到的,我们分析下,为什么a1会访问不到,原因就是class门和def门挡住了,就像生活中我把门关上了你能进来吗??当然不会。

那如果我们把门去掉是不是就可以了,ruby是可以的,看如下代码:

a1 = 1A = Class.new do    a2 = 2    p local_variables    define_method(:hello) do        a3 = 3        p local_variables    endenda = A.newa.hellop 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门 上面可以理解为扁平化作用域,压着压着就没了,也可以理解为共享作用域

原创粉丝点击