Ruby class 变量作用域问题

Ruby class variable scope issue

好的,所以我已经阅读了 class 变量、class 实例变量和 Ruby 中的实例变量。我发现 Phrogz 的 this explanation 很有启发性。

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

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 变量,每个都在各自方法的范围内,但对 class 的其余部分不可见?

但是如果我在方法之外将 @index_changed 变量声明为 class 实例变量,它是否也会在 class 个实例之间共享?

Am I assuming correctly, that currently I'm defining 4 different @index_changed variables, each in the scope of their respective method, but not visible to the rest of the class?

没有

@index_changed 是一个 实例变量 。它是 class.

的每个实例的属性
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

But if I declare the @index_changed variable outside of a method as a class instance variable, won't it be shared among class instances as well?

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


澄清一下,上面的代码声明了一个 "owned by the class instance" 的变量。因此它可以在所有方法中访问,但不能在不同的class实例之间共享。

另一方面,

A class 变量“ 由 class 所有”。所以,如果你喜欢,那就是 "shared between all instances".