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".
好的,所以我已经阅读了 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".