检查方法参数的类型

时间:2013-09-05 12:57:14

标签: ruby types

我不确定传递给方法的对象是否属于正确的类型。我可能会将一个字符串传递给一个只能处理整数的函数。什么样的运行时保证?我看不到比选择更好的选择:

def someFixNumMangler(input)
  raise "wrong type: integer required" unless input.class == FixNum
  other_stuff
end

有更好的选择吗?

2 个答案:

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

检查可能采取不同的形式。如果你期望,比如一个字符串,你在它上面调用字符串方法(upcasegsub等),如果传递除字符串以外的任何内容,代码将会爆炸。当然,除非你传递一个不是字符串的对象,但是行为就像一个(具有你调用的相同方法)。这是鸭子打字的本质。

如果您的方法看起来像这样怎么办?

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,您实际上并不关心其类型是什么。