实例变量,一旦设置了值就会阻止更改

时间:2015-03-03 05:43:43

标签: ruby exception instance-variables

有一个班级Section(作为MyModule mixin的一部分)。

其实例变量@mark初始化为nil,当其当前值为change_mark时,可以通过实例方法nil进行更改,但不能在{39}时进行更改已被设定为其他东西。我试图构建一些保护措施,以防止在这种情况下设置实例变量。

以下是我所拥有的:

module MyModule
  class Section
    attr_accessor :id, :mark

    def initialize(id, mark)
      @id = id
      @mark = mark
    end
    def change_mark(mark)
      if @mark != nil?
        message = "Section ##{@id} is already marked. Choose another."
        raise RuntimeError.new(message)
      else
        @mark = mark
      end
    end
  end
end

提出错误是阻止更改先前设置的实例变量的最简单方法吗?如果没有,我该怎么办?

2 个答案:

答案 0 :(得分:1)

如果你想成为超级严格的关于不让用户重置变量,那么是的,加注/失败是一个很好的方法。但请注意:使用mark=访问者,这样用户就不必记住使用限制性change_mark而不是全部允许默认编写者mark=

module MyModule
  class Section
    attr_accessor :id, :mark

    def initialize(id, mark)
      self.id = id
      self.mark = mark
    end

    # overwrite generated setter from attr_accessor
    def mark=(mark)
      if !mark.nil?
        message = "Section ##{id} is already marked. Choose another."
        fail RuntimeError.new(message)
      else
        @mark = mark
      end
    end
  end
end

或者您可以忽略新值。

def mark=(mark)
  @mark = mark if @mark.nil?
end

这样您就不会知道哪一行尝试重置值以及何时重置。但它更安静。这是你的选择。 :)

答案 1 :(得分:1)

我建议更改一行:

attr_accessor :id, :mark

两行如:

attr_accessor :id
attr_reader :mark

因此,您的mark只能通过change_mark方法更改,因此会引发适当的异常。

使用attr_reader :mark只为您的属性创建了“getter”方法,因此您不必担心设置属性值的其他任何方式。

祝你好运!