在Ruby上的方法中验证哈希参数的更好方法是什么?

时间:2016-02-05 16:28:31

标签: ruby hash

是否有更好的DRY方法来验证包含某些键的参数哈希?

module Exemple

 def foo_method(config)
  validate_config(config)

  foo = config[:foo]
  bar = config[:bar]
  qux = config[:qux] || {}

 end

 private

 def validate_config(config)
  raise(ArgumentError, "No foo config found", caller) unless config.has_key?(:foo)
  raise(ArgumentError, "No bar config found", caller) unless config.has_key?(:bar)
 end

end

3 个答案:

答案 0 :(得分:3)

使用Hash#fetch

def foo_method(config)
  foo = config.fetch(:foo)
  bar = config.fetch(:bar)
  qux = config.fetch(:qux, {})
end

foo_method({})               #=> key not found: :foo (KeyError)
foo_method({foo: 1})         #=> key not found: :bar (KeyError)
foo_method({foo: 1, bar: 2}) #=> no error

如果找不到给定密钥,也可以将块传递给被调用的fetch,例如:

  foo = config.fetch(:foo) { raise ArgumentError, "No foo config found" }

答案 1 :(得分:1)

根据您的ruby版本,您可以使用关键字参数? http://ruby-doc.org/core-2.1.0/doc/syntax/methods_rdoc.html#label-Keyword+Arguments

或者,通过循环所需的密钥来扩展当前的解决方案?

%i{foo bar}.each do |k|
    raise(ArgumentError, "No #{k} config found", caller) unless config.has_key?(k)
end

答案 2 :(得分:1)

将所需的配置密钥作为数组存储在模块的私有方法中,然后从中减去传递的配置散列的密钥,并查看生成的数组是否为空,如果不是丢失密钥则抛出错误。

module Example
   def foo_method(config)
     validate_config!(config)
     #do stuff
   end

   private

   def validate_config!(config)
     missing_keys = [:foo, :bar] - config.keys
     raise ArgumentError, "Config missing required keys: #{missing_keys.join(', ')}", caller unless missing_keys.empty?
   end

end

这样,如果你需要更多的密钥,你可以将它们添加到数组中,结果错误将始终包含所有缺失的密钥,而不仅仅是遇到的第一个密钥。