我不确定传递给方法的对象是否属于正确的类型。我可能会将一个字符串传递给一个只能处理整数的函数。什么样的运行时保证?我看不到比选择更好的选择:
def someFixNumMangler(input)
raise "wrong type: integer required" unless input.class == FixNum
other_stuff
end
有更好的选择吗?
答案 0 :(得分:5)
使用Kernel#Integer方法转换输入,然后再使用它。当输入无法以任何合理的方式转换为整数时,它将引发ArgumentError
。
def my_method(number)
number = Integer(number)
# do something with number, which is now guaranteed to be an integer
end
我推荐Avdi Grimm的新书Confident Ruby,以便更深入地了解这一点。
答案 1 :(得分:3)
如果你真的需要进行类型检查,那么是的,你只有运行时检查。问题中的代码是可以的。您也可以使用.is_a?
。
def someFixNumMangler(input)
raise "wrong type: integer required" unless input.is_a?(FixNum)
other_stuff
end
检查可能采取不同的形式。如果你期望,比如一个字符串,你在它上面调用字符串方法(upcase
,gsub
等),如果传递除字符串以外的任何内容,代码将会爆炸。当然,除非你传递一个不是字符串的对象,但是行为就像一个(具有你调用的相同方法)。这是鸭子打字的本质。
如果您的方法看起来像这样怎么办?
def someFixNumMangler(input)
input = input.to_i
puts "got this: #{input} of #{input.class}"
end
someFixNumMangler(10)
someFixNumMangler('42')
someFixNumMangler(File)
# >> got this: 10 of Fixnum
# >> got this: 42 of Fixnum
# ~> -:2:in `someFixNumMangler': undefined method `to_i' for File:Class (NoMethodError)
# ~> from -:9:in `<main>'
只要参数响应#to_i
,您实际上并不关心其类型是什么。