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

ayj*_*jay 5 ruby

根据wikibooks ...

  • @one下面 属于类对象的实例变量(注意这与类变量不同,不能被称为@@one)
  • @@value一个类变量(类似于Java或C++中的static).
  • @two 属于 MyClass 实例的实例变量.

我的问题:

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

class MyClass
  @one = 1
  @@value = 1

  def initialize()
    @two = 2
  end
end
Run Code Online (Sandbox Code Playgroud)

Aru*_*hit 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
Run Code Online (Sandbox Code Playgroud)

非共享变量

class A
  @var = 12
end

class B < A
  def self.meth
    @var
  end
end

B.meth # => nil
Run Code Online (Sandbox Code Playgroud)

@two是类的实例的实例变量MyClass.

实例变量是对象的私有属性,因此它们不会共享它.在Ruby中,类也是对象.@one你在一个类中定义MyClass,因此它只由定义它的类所拥有.另一方面,@two当您要创建类的对象(MyClass例如ob,使用)时,将创建实例变量MyClass.new.@two只有它所有ob,没有其他任何对象有任何想法.