什么是前面有两个at符号的Ruby变量(@@
)?我对带有at符号的变量的理解是它是一个实例变量,就像在PHP中这样:
PHP版本
class Person {
public $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
Ruby等效项
class Person
def set_name(name)
@name = name
end
def get_name()
@name
end
end
双at符号@@
是什么意思,它与单at符号有什么不同?
发布于 2011-05-05 05:46:39
@
-类的实例变量
@@
类变量,在某些情况下也称为静态变量
类变量是在类的所有实例之间共享的变量。这意味着从这个类实例化的所有对象只有一个变量值。如果一个对象实例更改了变量的值,那么所有其他对象实例的新值都将发生本质上的变化。
另一种思考类变量的方式是在单个类的上下文中作为全局变量。通过在变量名前加上两个@
字符(@@
)来声明类变量。类变量必须在创建时初始化
发布于 2011-05-05 05:34:13
@@
表示一个类变量,即它可以被继承。
这意味着如果创建该类的子类,它将继承变量。因此,如果您有一个带有类变量@@number_of_wheels
的Vehicle
类,那么如果您创建了一个class Car < Vehicle
,那么它也将具有类变量@@number_of_wheels
发布于 2017-05-16 11:44:46
当类扩展或包含模块时,模块中的@和@@的工作方式也不同。
所以给出了
module A
@a = 'module'
@@a = 'module'
def get1
@a
end
def get2
@@a
end
def set1(a)
@a = a
end
def set2(a)
@@a = a
end
def self.set1(a)
@a = a
end
def self.set2(a)
@@a = a
end
end
然后,您将获得以下显示为注释的输出
class X
extend A
puts get1.inspect # nil
puts get2.inspect # "module"
@a = 'class'
@@a = 'class'
puts get1.inspect # "class"
puts get2.inspect # "module"
set1('set')
set2('set')
puts get1.inspect # "set"
puts get2.inspect # "set"
A.set1('sset')
A.set2('sset')
puts get1.inspect # "set"
puts get2.inspect # "sset"
end
class Y
include A
def doit
puts get1.inspect # nil
puts get2.inspect # "module"
@a = 'class'
@@a = 'class'
puts get1.inspect # "class"
puts get2.inspect # "class"
set1('set')
set2('set')
puts get1.inspect # "set"
puts get2.inspect # "set"
A.set1('sset')
A.set2('sset')
puts get1.inspect # "set"
puts get2.inspect # "sset"
end
end
Y.new.doit
因此,在模块中对所有变量使用@@,在模块中对变量使用@,在每个使用上下文中分隔变量。
https://stackoverflow.com/questions/5890118
复制相似问题