在Ruby中使用or运算符简化“任意”的检查

4

How to simplify the following check ?...

if node[:base][:database][:adapter].empty? || node[:base][:database][:host].empty? || 
  node[:base][:database][:database].empty? || node[:base][:database][:port].empty? 

翻译成类似于

required_keys = { :adapter, :host, :database...etc...} 
required keys - node[:base][:database] == [] 

这个语法有点不对,但基本上是从所需的键的集合中减去你拥有的键。如果你拥有所有所需的键,结果应该为空。

我不确定正确的语法?任何帮助将不胜感激。

2个回答

10
required_keys = [:adapter, :host, :database ]
if required_keys.any?{|x| node[:base][:database][x].empty?}
  #code here
end

或者您也可以这样做:

node[:base][:database].values_at(*required_keys).any?(&:empty?) 

0
如果您认为您将在多个地方使用此功能,则可以扩展Hash类并在初始化程序中要求扩展。
class Hash

  def contains_values_for?(*keys)
    keys.all? do |key|
      self[key].present?
    end
  end

end

现在你可以做:

node[:base][:database].contains_values_for?(:adapter, :host, :database, :port)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接