本帖最后由 taroxd 于 2014-7-5 16:06 编辑
在Ruby中,实变量以@开头,通常表示一个类的实例或者是作用在一个类中的“小型全局变量”。实变量的作用范围是整个类,也就是说,在某个类别外使用定义在它上的实变量是无效的。例如:
实例变量没有作用域的问题,永远是根据self来访问的。
class T
@var = 0
singleton_class.send :attr_writer , :var
attr_writer :var
def initialize
@var = 1
end
p @var # => 0
end
t = T.new
p T.instance_variable_get ( :@var) # => 0
T.instance_eval { p @var } # => 0
p t.instance_variable_get ( :@var) # => 1
t.instance_eval { p @var } # => 1
T.var = 2
t.var = 3
T.instance_eval { p @var } # => 2
t.instance_eval { p @var } # => 3
class T
@var = 0
singleton_class.send :attr_writer , :var
attr_writer :var
def initialize
@var = 1
end
p @var # => 0
end
t = T.new
p T.instance_variable_get ( :@var) # => 0
T.instance_eval { p @var } # => 0
p t.instance_variable_get ( :@var) # => 1
t.instance_eval { p @var } # => 1
T.var = 2
t.var = 3
T.instance_eval { p @var } # => 2
t.instance_eval { p @var } # => 3
这和类的作用域完全没有关系
但你何曾看过Object.new这样创建Object对象的语句了?
怎么没有?余烬之中不就这么干的……
可以include。混入(Mix-In)时也会混入常量
====================补充==================
class Person
@name = "XX"
def pr_name
print @name
end
end
print @name
class Person
@name = "XX"
def pr_name
print @name
end
end
print @name
我觉得你这个例子就是在满满地误导啊……
三个@name没有两个是同一个东西的……
一个是类Person的实例变量
一个是类Person的实例的实例变量
一个是类Object的实例main的实例变量