有一个班级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
提出错误是阻止更改先前设置的实例变量的最简单方法吗?如果没有,我该怎么办?
答案 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”方法,因此您不必担心设置属性值的其他任何方式。