是否有更好的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
答案 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
这样,如果你需要更多的密钥,你可以将它们添加到数组中,结果错误将始终包含所有缺失的密钥,而不仅仅是遇到的第一个密钥。