【问题标题】:Ruby class variable scope issueRuby类变量范围问题
【发布时间】:2018-04-08 00:13:13
【问题描述】:

好的,所以我已经阅读了 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 变量声明为类实例变量,它不也会在类实例之间共享吗?

【问题讨论】:

    标签: ruby variables scope class-instance-variables


    【解决方案1】:

    我的假设是否正确,目前我正在定义 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 变量声明为类实例变量,那么它不也会在类实例之间共享吗?

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


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

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

    【讨论】:

    • 谢谢@Tom 回答了我的问题。现在我知道我的问题出在其他地方! :)
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2016-08-30
    • 2011-11-21
    • 2011-04-13
    • 2016-06-21
    相关资源
    最近更新 更多