如何在Ruby中强制变量的输入为整数

时间:2014-09-24 09:56:15

标签: ruby

我有一个Player课程,@hitpoints方法中有一个变量initialize。我已使用attr_accessor :hitpoints

使变量可访问

当创建类Player的实例时,确实可以访问该变量。但是,我想只允许写一个整数。截至目前,我可以指定一个字符串:

conan.hitpoints = "Hello there!"

知道怎么做到这一点吗?

2 个答案:

答案 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