array.reject中的Ruby多行评估块! - 更好的方法?

时间:2014-02-22 22:32:44

标签: ruby

我有一段代码根据另一个哈希数组中的缺失匹配拒绝哈希数组条目。我想在reject!()内执行多个操作。以下代码按预期工作,但这是将true返回reject的最佳方式吗?

我尝试用miss =包装替换if con.any? ... end,但if语句不返回true

我真的需要拼出下面列出的true if miss行吗?

libs.reject! do |x|   
  miss = con.any? {|h| [:lib, :f2, :f3].all?{|z| x[z]==h[z]}}
  print_err("ERROR, libs #{x[:lib]} not found with #{x[:f2]} and #{x[:f2]}") if miss
  (mm_xls.add_row ["MISS", x[:lib], x[:f2], x[:f3]], :style => r_entry) if miss
  true if miss
end

2 个答案:

答案 0 :(得分:2)

你可以使用tap来执行一个产生接收器的块,然后返回同一个对象:

libs.reject! do |x|
  con.any? {|h| ... }.tap do |condition|
    print_err(...) if condition
    # etc ...
  end
end

在这种情况下,tap会返回any?块的结果。

答案 1 :(得分:2)

您可以避免以这种方式创建miss变量

libs.reject! do |x|   
  if con.any? {|h| [:lib, :f2, :f3].all?{|z| x[z]==h[z]}}
    print_err("ERROR, libs #{x[:lib]} not found with #{x[:f2]} and #{x[:f2]}")
    mm_xls.add_row ["MISS", x[:lib], x[:f2], x[:f3]], :style => r_entry
    true
  end
end