验证Ruby中的参数?

时间:2010-08-05 02:02:00

标签: ruby

我想知道是否应该验证传递给方法的参数是否属于某个类。

例如

def type(hash = {}, array = [])
  # validate before
  raise "first argument needs to be a hash" unless hash.class == Hash
  raise "second argument needs to be an array" unless array.class == Array

  # actual code
end

这样做是否聪明还是只是麻烦而且浪费时间来验证所有传递的参数?

在您不想打扰的情况下,您是否希望获得额外的安全和环境?

分享您的经历!

5 个答案:

答案 0 :(得分:9)

我不推荐这种特定方法,因为您无法容纳提供散列或数组语义但不是该类的类。如果您需要这种验证,最好将respond_to?与方法名称一起使用。数组实现方法:[],它的价值。

OpenStruct具有哈希语义和属性访问器方法语义,但对于条件hash.class==Hash不会返回true。不过,它在实践中就像哈希一样。

为了正确看待它,即使是非动态语言,你也不希望这样做;您更愿意验证对象是否实现了IDictionary<T>。 Ruby会在惯用时更喜欢在必要时验证方法是否存在,因为如果确实存在,开发人员可能会打算使用它们的对象。您可以通过围绕客户端代码进行单元测试来提供额外的理智,作为强制事物非动态的替代方法。

答案 1 :(得分:5)

通常不需要验证参数是否属于某个类。在Ruby中,我们鼓励您使用Duck Typing

答案 2 :(得分:3)

我认为这是不必要的。我曾经在博客上看到过“如果你需要保护你的代码免受愚蠢的人的侵害,那么ruby就不适合你。”

答案 3 :(得分:2)

我发现验证输入参数符合您的前提条件是一种非常有价值的做法。拯救你的愚蠢的人就是你。对于Ruby来说尤其如此,因为它没有编译时检查。如果您知道的方法输入的某些特性必须为true,则会使senes在运行时检查它们并使用有意义的错误消息引发错误。否则,代码只是开始为垃圾输出垃圾而你得到一个错误的答案或在线下的异常。

答案 4 :(得分:1)

如果你想要编译器/运行时强制的代码契约,那么Ruby不适合你。如果你想要一种可塑的语言和易测试性,那么Ruby就是。