在Ruby中,为什么需要初始化子类变量?

时间:2013-09-02 18:57:53

标签: ruby class variables

我有一个Foo课,我创建了一个儿童案例吧。 如果已经在父类中初始化了@coo_count,为什么必须在子类中初始化它?

请指教?

class Foo
  @foo_count = 0  
end

class Bar < Foo
  @foo_count = 100
end

2 个答案:

答案 0 :(得分:2)

为什么这样?好的,让我这样告诉你:

class Foo
  @foo_count = 0  
end

class Bar < Foo;end

Bar.instance_variables # => []
Foo.instance_variables # => [:@foo_count]
@foo_count

Foo 类实例变量 。无论何时从像Bar这样的超类创建类似Foo的子类,都不要认为类实例变量将继承到类Bar。现在看 -

class Foo
  @foo_count = 0  
end

class Bar < Foo
  @foo_count = 10
end

Bar.instance_variables # => [:@foo_count]
Foo.instance_variables # => [:@foo_count]

现在,对象FooBar都有它们的实例变量,只有同名@foo_count,这并不意味着它们共享同一个实例变量。每个对象都有总是它自己的实例变量副本。

这里有一些例子可以让你清楚地了解事情: -

class Foo
  @foo_count = 0 
  def self.meth_foo 
    @foo_count
  end 
end

class Bar < Foo
  #@foo_count = 10
end

Foo.meth_foo # => 0
Bar.meth_foo # => nil

但是现在 -

class Foo
  @foo_count = 0 
  def self.meth_foo 
    @foo_count
  end 
end

class Bar < Foo
  @foo_count = 10
end

Foo.meth_foo # => 0
Bar.meth_foo # => 10

答案 1 :(得分:1)

实例变量将自身附加到创建时自身的任何对象。 Foo中的实例变量@foo_count附加到Foo类对象,因此它被称为类实例变量。类似地,Bar中的实例变量@foo_count将自身附加到Bar类对象。因此,有两个类实例变量 - 而不是一个。对象不共享实例变量 - 每个对象都有自己的实例变量。

class Foo
  puts self

  @foo_count = 0  
end

class Bar < Foo
  puts self

  @foo_count = 100
end

--output:--
Foo
Bar

顺便说一下,如果你想要继承变量,你可以使用类变量

class Foo
  @@foo_count = 'hello' 
end

class Bar < Foo
  def greet
    puts @@foo_count
  end

end

Bar.new.greet

--output:--
hello

然而,许多人认为使用类变量是不好的做法。它们不像其他语言中的类变量那样,因此它们会产生意想不到的后果,因此通常人们会坚持类实例变量