1

好的,所以我已经阅读了 Ruby 中的类变量、类实例变量和实例变量。我发现Phrogz 的这个解释很有启发性。

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

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

我想要的是这个:( 就像@my_thingsPhrogz 的例子中)

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方法之外的变量声明为类实例变量,那么它不会在类实例之间共享吗?

4

1 回答 1

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方法之外的变量声明为类实例变量,那么它不会在类实例之间共享吗?

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


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

另一方面,类变量“归类所有”。因此,如果您愿意,它可以“在所有实例之间共享”。

于 2017-10-26T14:51:20.833 回答