2

我有几个 ruby​​ 函数,想检查输入是否正确以及输入是否有意义。这样做的明智方法是什么?

这是一个示例,其中包含我拥有的功能之一以及我想检查的内容

# Converts civil time to solar time
# civilT: Time object
# longitude: float
# timezone: fixnum
def to_solarT(civilT,longitude,timezone)
    # pseudo code to check that input is correct
    assert(civilT.class == Time.new(2013,1,1).class)
    assert(longitude.class == 8.0.class)
    assert(timezone.class == 1.class)

    # More pseudocode to check if the inputs makes sense, in this case 
    # whether the given longitude and timezone inputs make sense or whether 
    # the timezone relates to say Fiji and the longitude to Scotland. Done 
    # using the imaginary 'longitude_in_timezone' function
    assert(longitude_in_timezone(longitude,timezone))
end

我在这里找到了一个相关的问题:how to put assertions in ruby​​ code。这是要走的路还是有更好的方法来测试 ruby​​ 中的函数输入?

4

2 回答 2

3

你不应该这样做。Ruby 严重依赖鸭子类型。也就是说,如果它像鸭子一样嘎嘎叫,那它就是鸭子。即,只需使用您收到的对象,如果它们响应正确,那很好。如果他们不这样做,您可以挽救 NoMethodError 并显示适当的输出。

于 2013-06-30T06:24:37.360 回答
3

assert不是标准的 Ruby 方法,并且经常被测试框架使用,所以我认为将它放在代码中并不好。此外,创建要检查参数的类的实例也没有意义。更直接地说,

def to_solarT civilT, longitude, timezone
  raise "Argument error blah blah" unless Time === civilT
  raise "Argument error blah blah" unless Float === longitude
  raise "Argument error blah blah" unless Fixnum === timezone
  ...
end
于 2013-06-30T06:54:24.250 回答