我有一个班级 Foo,我创建了一个子案例 Bar。如果 @foo_count 已经在父类中初始化,为什么我必须在子类中初始化它?
请指教?
class Foo
@foo_count = 0
end
class Bar < Foo
@foo_count = 100
end
为什么这样?好的,让我这样告诉你:
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]
现在对象Foo
和Bar
实例变量都具有相同的名称@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
实例变量在创建它们时将它们自己附加到任何对象本身。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
但是,许多人认为使用类变量是不好的做法。它们的行为不像其他语言中的类变量,因此会产生意想不到的后果,因此人们通常坚持使用类实例变量。