我有一个Player
课程,@hitpoints
方法中有一个变量initialize
。我已使用attr_accessor :hitpoints
。
当创建类Player
的实例时,确实可以访问该变量。但是,我想只允许写一个整数。截至目前,我可以指定一个字符串:
conan.hitpoints = "Hello there!"
知道怎么做到这一点吗?
答案 0 :(得分:1)
您可以为它编写自定义设置器:
class Player
attr_accessor :hitpoints
def hitpoints=(value)
raise 'Not an integer' unless value.is_a? Integer
@hitpoints = value
end
end
您还应该在初始化方法中使用此setter而不是实例变量:
def initialize(hitpoints)
self.hitpoints = hitpoints
end
更新:
关于attr_accessor
。此方法为属性定义了setter和getter方法。因为您稍后在代码中定义了自己的setter,所以不需要默认的setter,并且可能会被attr_reader
丢弃,正如Stefan和Arup的评论所示。
我对此感到非常复杂,好像你和其他人一起工作,他会首先注意到你班上的attr_reader
并且会想到 - Hey, why is it a read_only attribute
?如果它是一个新的开发人员,它甚至可能导致他写一些无意义的代码。
我相信代码是为了显示其目的,因此我会使用attr_accessor
,即使它给我method redefined
警告。然而,这是个人偏好的问题。
答案 1 :(得分:0)
另一种常见做法是转换参数,例如:使用to_i
:
def hitpoints=(value)
@hitpoints = value.to_i
end
10.to_i #=> 10
10.5.to_i #=> 10
"10".to_i #=> 10
"foo".to_i #=> 0
或Integer
:
def hitpoints=(value)
@hitpoints = Integer(value)
end
Integer(10) #=> 10
Integer(10.5) #=> 10
Integer("10") #=> 10
Integer("foo") #=> ArgumentError: invalid value for Integer(): "foo"
请注意,您不一定要键入检查您的参数。如果对象的行为不符合预期,Ruby迟早会引发异常:
health = 100
hitpoints = "foo"
health -= hitpoints #=> TypeError: String can't be coerced into Fixnum