module 和 class 和 def (作用域门)

6 篇文章 0 订阅

作用域门:
在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门 上面可以理解为扁平化作用域,压着压着就没了,也可以理解为共享作用域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值