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 //作用域门:离开def门end //作用域门:离开Class门a = 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门 上面可以理解为扁平化作用域,压着压着就没了,也可以理解为共享作用域
阅读全文
0 0
- module 和 class 和 def (作用域门)
- ruby-module和class
- dll中def和exp文件作用
- module和class module 的区别
- ES6入门 —— Class和Module
- Ruby module和class的理解分析
- vb的module 和class module 有什么区别?
- Def和__declspec(dllexport)
- 【#ifdef和#def】使用方法
- VS中def文件对于生成dll和lib文件的作用
- VS中def文件对于生成dll和lib文件的作用
- vc++工程中.def文件的作用和动态库导出函数的方法.
- VS中def文件对于生成dll和lib文件的作用
- DLL 的编写,导出函数 DLL 中.def和extern c的作用
- def.h和global.h
- abstract class和interface区别与作用
- #include和#import区别以及@class作用
- Class.forName()和newInstance()的作用
- vi /etc/updatedb.conf 搜索文件说明
- Android数据存储之SQLite
- LIS的nlog(n)算法
- 1. Two Sum
- python之路——小购物车程序
- module 和 class 和 def (作用域门)
- python中的特殊函数__call__()以及init,setattr,getattr,delattr
- JAVA 虚拟机,垃圾回收算法
- HDU 6030 DP + 矩阵快速幂
- ACE_Singleton类学习
- 欢迎使用CSDN-markdown编辑器
- Activity生命周期
- 5个学习Linux命令站点推荐
- JSP学习---jsp简介和理解jsp的本质