Ruby类变量的初始值

时间:2016-09-13 14:52:49

标签: ruby

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。为什么呢?

4 个答案:

答案 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)

实例变量属于对象(又称实例),这就是为什么它们毕竟被称为“实例变量”。

此处有两个对象:TestClass的实例,aTest的实例。两者都是对象,就像任何其他对象一样。两者都可以像任何其他对象一样拥有实例变量。

两者都有一个名为@a的实例变量。 Foo的{​​{1}}已初始化为@a100的{​​{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代码的直接翻译。