Ruby类变量范围问题

时间:2017-10-26 14:39:59

标签: ruby variables scope class-instance-variables

好的,所以我已经读过Ruby中的类变量,类实例变量和实例变量了。我发现Phrogz的this explanation非常有启发性。

现在我正在尝试向我的类中添加一个可由我的类中的多个方法访问的变量,但这不是在该类的多个实例之间共享:

Class QuizSession < ApplicationRecord
  attr_accessor :index_changed
  def initialize
    @index_changed = false
  end

  def index_changed?
    @index_changed
  end

  def set_index_changed!
    @index_changed = false
  end

  def method_a
    do sth.
    ...
    @index_changed = true
  end
end

我想要的是:(例如Phrogz example中的@my_things

session_a = QuizSession.new
session_b = QuizSession.new

session_a.method_a

p session_a.index_changed? #=> true
p session_b.index_changed? #=> false

我是否正确地假设,目前我定义了4个不同的@index_changed变量,每个变量都在各自的方法范围内,但对于其他类的人来说是不可见的?

但是如果我将方法之外的@index_changed变量声明为类实例变量,那么它也会在类实例之间共享吗?

1 个答案:

答案 0 :(得分:2)

  

我是否正确地假设,目前我正在定义4个不同的@index_changed变量,每个变量都在各自的方法范围内,但对于其他类的人来说是不可见的?

没有

@index_changed实例变量。它是类的每个实例的属性。

class Foo
  attr_reader :my_instance_var
  def initialize(val)
    @my_instance_var = val
  end
end

f1 = Foo.new(true)
f2 = Foo.new(false)

f1.my_instance_var # => true
f2.my_instance_var # => false
  

但是如果我将方法之外的@index_changed变量声明为类实例变量,那么它也不会在类实例之间共享吗?

是的,因为在这种情况下,您将声明一个实例变量。这是不同的。

为了澄清,上面的代码声明了一个“由类实例拥有”的变量。所以它可以在所有方法中访问,但不在不同的类实例之间共享。

另一方面,类变量是“拥有类”。所以,如果你愿意,它是“在所有实例之间共享”。