我有一段代码根据另一个哈希数组中的缺失匹配拒绝哈希数组条目。我想在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
答案 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