验证Ruby中的参数?

nev*_*ame 5 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
Run Code Online (Sandbox Code Playgroud)

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

在您不想打扰的情况下,您是否希望拥有这种额外的安全和环境?

分享您的经历!

Jas*_*rue 9

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

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

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


Zar*_*ony 5

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