赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
- 姑且假设你说的“其它方法中的变量”是指局部变量……
所谓的局部变量就是在一个局部范围内使用的变量,它的生命,或者说作用域仅仅在于局部,压根儿就不是用来在外部调用的,要在外部用的话,自然就应该使用这个“外部”范围内也存在的变量(实例变量 @、类变量 @@ 或全局变量 $)
不过 Ruby 也并非完全不可能获取其它方法中的局部变量~我们可以获取那个方法的执行上下文环境,并保存下来,这样就可以在其它地方去访问属于这个上下文环境的局部变量了:- def fn
- a = 9999
- $my_binding = binding
- end
- fn
- eval("p a", $my_binding) # => 9999
复制代码 这就是 Ruby 的 binding 机制
不过,访问其它上下文中的局部变量的前提是这个上下文存在过,所以你才能通过 binding 得到它的环境……而你说的在一个类的一个方法中调用另一个方法的变量,这“另一个方法”通常是没有调用过的,所以它的局部上下文没有产生。因此,这时你肯定应该使用作用域更大的变量——如果你的方法是实例方法,那就应该用实例变量;如果你的方法是类方法,那就应该用类变量
至于你说的其它类的变量,还是指代不明……如果是说其它类的类变量,那么可以定义一个类方法,直接返回这个类变量即可;如果是说其它类的实例变量,那必须要生成类的实例,才能通过实例来访问这个实例变量 - :: 是一个名字空间的修饰运算符。变量和函数都有定义了它的一个名字空间(正如文件有一个包含了它的文件夹),而在一个名字空间中要访问其它名字空间的变量/函数,就需要通过这个运算符来修饰该变量/函数的名字,比如 Math::PI,就是因为 PI 是在 Math 这个模块(名字空间)中定义的一个常量;Struct::Tms,就是因为 Tms 是在 Struct 这个模块中定义的类~
|
|