好的,所以我已经读过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
变量声明为类实例变量,那么它也会在类实例之间共享吗?
答案 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
变量声明为类实例变量,那么它也不会在类实例之间共享吗?
是的,因为在这种情况下,您将声明一个类实例变量。这是不同的。
为了澄清,上面的代码声明了一个“由类实例拥有”的变量。所以它可以在所有方法中访问,但不在不同的类实例之间共享。
另一方面,类变量是“拥有类”。所以,如果你愿意,它是“在所有实例之间共享”。