根据wikibooks ...
@one
是属于类对象的实例变量(请注意,这与类变量不同,不能称为{{1} })@@one
是类变量(类似于Java或C ++中的static)。 @@value
是属于MyClass 的实例的实例变量。 我的问题:
@one和@@值之间有什么区别?
另外,是否有理由使用@one?
@two
答案 0 :(得分:5)
@one
是类MyClass
的实例变量,@@value
是类变量MyClass
。由于@one
是一个实例变量,它只归类MyClass
所有(在Ruby类中也是对象),而不是 可共享 ,但@@value
是 共享变量 。
共享变量
class A
@@var = 12
end
class B < A
def self.meth
@@var
end
end
B.meth # => 12
非共享变量
class A
@var = 12
end
class B < A
def self.meth
@var
end
end
B.meth # => nil
@two
是类MyClass
的实例的实例变量。
实例变量是对象的私有属性,因此它们不会共享它。在Ruby中,类也是对象。您在类@one
中定义的MyClass
,因此它仅由定义它的类所拥有。另一方面,当您使用@two
创建类MyClass
的对象(例如ob
)时,将创建MyClass.new
实例变量。 @two
仅归ob
所有,其他任何对象都不知道。
答案 1 :(得分:0)
我想到的方式是谁应该持有信息或能够执行任务(因为类方法与实例方法相同)。
class Person
@@people = []
def initialize(name)
@name = name
@@people << self
end
def say_hello
puts "hello, I am #{@name}"
end
end
# Class variables and methods are things that the collection should know/do
bob = Person.new("Bob") # like creating a person
Person.class_variable_get(:@@people) # or getting a list of all the people initialized
# It doesn't make sense to as bob for a list of people or to create a new person
# but it makes sense to ask bob for his name or say hello
bob.instance_variable_get(:@name)
bob.say_hello
我希望有所帮助。