在PHP
我写道:
Class Test{
public $a=100;
}
$a=new Test();
echo $a->a; //prints 100
它打印100
,但在我写的时候是红宝石:
class Test
@a=100
attr_accessor :a
end
a=Test.new
puts a.a #=> prints nil
a
为零,并打印nil
。为什么呢?
答案 0 :(得分:3)
你稍微混合了一些东西。
您使用@a = 100
定义的是类实例变量。
您可以使用attr_accessor :a
访问的是实例变量 @a
。
实例变量用法示例:
class A
def initialize a
@a = a
end
attr_accessor :a
end
instance = A.new(2)
#=> 2
instance.instance_variables
#=> [:@a]
instance.a
#=> 2
类实例变量用法示例:
class A
@a = 1
class << self
attr_accessor :a
end
end
A.a
#=> nil
A.a = 2
#=> 2
A.a
#=> 2
instance = A.new
instance.class.a # access instance's class instance variable
#=> 2
答案 1 :(得分:2)
实例变量属于对象(又称实例),这就是为什么它们毕竟被称为“实例变量”。
此处有两个对象:Test
,Class
的实例,a
,Test
的实例。两者都是对象,就像任何其他对象一样。两者都可以像任何其他对象一样拥有实例变量。
两者都有一个名为@a
的实例变量。 Foo
的{{1}}已初始化为@a
。 100
的{{1}}根本没有初始化,并且整数化的实例变量评估为a
。
所以,你的问题是你在混淆你正在看的实例。实例变量总是在@a
中查找,而在类定义主体中,nil
是要定义的类。
这可能听起来很迂腐,但我发现理解Ruby实际上比人们有时希望你相信的更简单将最终帮助你。
答案 2 :(得分:1)
请改为尝试:
class Test
attr_accessor :a
def initialize
@a = 100
end
end
a = Test.new
puts a.a
答案 3 :(得分:1)
发生这种情况的原因是这一行:
@a = 100
分配给实例变量但不是您想要的变量。它被分配给Test.a
,(测试是Class
的实例),而不是属于a
的每个实例的实例变量Test
反过来,这一行:
attr_accessor :a
声明一个名为a
的实例变量的访问者(可通过Test
的任何实例访问)
因此你应该
class Test
@a = 100
class << self
attr_accessor :a
end
end
puts Test.a #=> will print 100
或
class Test
def initialize
@a = 100
end
attr_accessor :a
end
a = Test.new
puts a.a #=> will print 100
这取决于您是只想要一个类常量,还是希望每个实例都有一个默认值的属性。后者是PHP代码的直接翻译。