" @"之间的区别属于类对象的实例变量和" @@" Ruby中的类变量?

时间:2014-05-02 08:32:36

标签: ruby

根据wikibooks ...

    下面的
  • @one是属于类对象的实例变量(请注意,这与类变量不同,不能称为{{1} })
  • @@one类变量(类似于Java或C ++中的static)。
  • @@value 是属于MyClass 的实例的实例变量

我的问题:

@one和@@值之间有什么区别?
另外,是否有理由使用@one?

@two

2 个答案:

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

我希望有所帮助。