实例变量:属于Object对象属于实例

时间:2016-04-06 08:18:31

标签: ruby

我在看some Ruby documentation,我发现了以下内容:

class MyClass
  @one = 1

  def do_something
    @one = 2
  end

  def output
    puts @one
  end
end

instance = MyClass.new
instance.output
instance.do_something
instance.output

令人惊讶的是,这输出:

nil
2

文档中的解释如下:

  

这种情况发生(在第一个输出行中为零),因为在类MyClass 下面定义的 @one 是属于类对象的实例变量(注意这不一样作为一个类变量,不能称为 @@ one ),而在 do_something 方法中定义的 @one 是属于的实例变量到MyClass的实例。它们是两个不同的变量,第一个只能在类方法中访问。

我不明白这个解释......到目前为止,我得到的是:

  1. 类变量,类似于其他语言中的静态属性。这很清楚。
  2. 属于类对象的实例变量
  3. 属于实例的实例变量
  4. 我不明白 2 & 3

    2 听起来像点 1 ,除了明确说明 它不是。点 3 听起来像普通的类属性,除了它不能在类方法之外定义(??)

    有人可以帮助我理解这一点,也许可以添加一些例子,以便我可以看到使用这3种变量的存在吗?

2 个答案:

答案 0 :(得分:3)

实例变量属于实例(又称对象)。每个对象都有自己的实例变量。

上面的代码中有两个对象:instanceMyClass。每个对象都有自己的一组实例变量。

MyClass有一个名为@one的实例变量,该变量初始化为1

第一次调用output时,instance没有名为@one的实例变量,但没关系:未初始化和未定义的实例变量不要提出异常,他们只是评估为nil。调用do_something时,instance的实例变量@one会自动创建(实例变量在第一次分配时会神奇地存在)并初始化为{{1} },以便第二次调用2时,它现在打印output

2的实例变量MyClass是一个红色的鲱鱼,它永远不会在上面的代码中访问(当然,在创建和初始化它的第2行之后)。

类变量用双倍@one标记表示。它们属于一个类(实际上是一个模块),并且在所有子类,所有实例,所有子类的所有实例,所有子类,所有子子类的所有实例等之间共享。它们应该被认为是(略微)限制形式的全局变量。

答案 1 :(得分:2)

鉴于作业:

class MyClass
  @@class_variable = 3
  @class_instance_variable = 1
  def initialize
    @instance_variable = 2
  end
end

可见性如下:

class MyClass
  def my_instance_method
    @@class_variable         # => Can refer (`3`)
    @class_instance_variable # => Cannot refer (`nil`)
    @instance_variable       # => Can refer (`2`)
  end
  def self.my_singleton_method
    @@class_variable         # => Can refer (`3`)
    @class_instance_variable # => Can refer (`1`)
    @instance_variable       # => Cannot refer (`nil`)
  end
  @@class_variable           # => Can refer (`3`)
  @class_instance_variable   # => Can refer (`1`)
  @instance_variable         # => Cannot refer (`nil`)
end

class SubClass < MyClass
  def my_instance_method
    @@class_variable         # => Can refer (`3`)
    @class_instance_variable # => Cannot refer (`nil`)
    @instance_variable       # => Cannot refer (`nil`)
  end
  def self.my_singleton_method
    @@class_variable         # => Can refer (`3`)
    @class_instance_variable # => Cannot refer (`nil`)
    @instance_variable       # => Cannot refer (`nil`)
  end
  @@class_variable           # => Can refer (`3`)
  @class_instance_variable   # => Cannot refer (`nil`)
  @instance_variable         # => Cannot refer (`nil`)
end