第七章 默认对象和作用域<o:p></o:p>
self在程序执行过程中不断改变。任一时刻只有一个对象扮演self的角色。
为了知道哪个对象是self,需要知道当前的上下文。有顶层上下文、类定义块、模块定义块、模型定义块和方法定义块上下文。self由当前的上下文所决定。<o:p></o:p>
术语顶层指的是在任何类或模块定义块之外的程序代码。如果打开一个新的文本文件并键入
x=1
就产生了一个顶层局部变量x。如果键入
def m
end
就产生了一个顶层方法。
在没有进入任何定义块之前,self是main。<o:p></o:p>
在类或模块定义中,self是类对象或模块对象。<o:p></o:p>
在定义块内部中的裸词XXX是self.XXX的简化形式。当在回到类定义块的外面,为了调用XXX,需要指明接收者<o:p></o:p>
实例变量和self
实例变量属于包含该实例变量的代码执行时扮演self角色的对象(即当前对象)
class C
def show_var
@v = "I am ..."
puts @v
end
@v = "IN..."
end
c.new.show_var<o:p></o:p>
全局作用域的优缺点
通过将信息保存在全局变量中,而不是设计必须用方法调用来获取信息的对象,多个类可以共享信息。但是使用全局变量对程序设计没有什么好处,反而最终会市区程序设计的稳固性和灵活性。
$gvar = "I'am.."
class C
def examine_global
puts $gvar
end
end
c = C.new
c.new.examine_global<o:p></o:p>
局部作用域
每次使用关键字def,class,module引入一个定义时,就开始了一个新的局部作用域。不论它们如何嵌套,都是这样的。
class C
a = 1
def local_a
a = 2
puts a
end
puts a
end
c = C.new
c.local_a
该代码输出如下:
1
2<o:p></o:p>
常量可定义在类和模块的定义块内。如果了解定义的嵌套关系,则可以从任意位置访问常量:
Moudle M
Class C
Class D
Module N
X = 1
End
End
End
End
Puts M::C::D::N::X<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>