简化“ if then”块

时间:2018-11-01 06:31:01

标签: ruby

我有几个看起来像这样的代码实例:

if checkProperties(top_properties, payload) == false
   return false
end

checkProperties仅对false有一个收益,具体取决于某些条件:

def checkProperties(properties, to_check)
   properties.each do |property|
      if to_check[property.to_s].nil? or to_check[property.to_s].blank?
         log_err("Something went wrong")
         return false
      end
    end
end

但是我觉得这可以简化。仅使用以下内容是否有效?

return false unless checkProperties(top_properties, payload)

还有其他建议吗?

3 个答案:

答案 0 :(得分:2)

首先不要从方块返回。请改用break

def checkProperties(properties, to_check)
  properties.each_with_object(true) do |property, _|
    if to_check[property.to_s].to_s.empty?
      log_err("Something went wrong")
      break false
    end
  end
end

或使用any?和/或all?

def checkProperties(properties, to_check)
  (!properties.any? { |p| to_check[p.to_s].to_s.empty? }).tap do |good|
    log_err("Something went wrong") unless good
  end
end

要明确显示缺少的属性,请使用Enumerable#find

def empty_property?(properties, to_check)
  !!(properties.find { |p| to_check[p.to_s].to_s.empty? }.tap do |prop|
    log_err("Property #{prop.inspect} was missing") unless prop.nil?
  end)
end

我还自由地将方法重命名为遵循Ruby命名约定(对于返回true / false的方法,请在蛇形情况下加问号)。

true返回的可能值(缺少的属性或false)中产生find / nil需使用两次爆炸技巧。

答案 1 :(得分:1)

您可以使用all?枚举器进行检查。仅当所有值都低于以下值时,它才会返回true:

def checkProperties(properties, to_check)
  properties.all? { |p| to_check[p.to_s] && !to_check[p.to_s].blank? }
end

如果property中的任何to_check为零/不存在,则all?将返回false并从那里停止迭代。

答案 2 :(得分:1)

  

还有其他建议吗?

自定义错误类将起作用:

class PropertyError < StandardError
end

遇到财产遗失时可以举起它:

def check_properties(properties, to_check)
  properties.each do |property|
    raise PropertyError if to_check[property.to_s].blank?
  end
end

这将消除对条件和显式收益的需要,您只需致电:

def foo
  check_properties(top_properties, payload)

  # do something with top_properties / payload
end

在“上方”某处,您可以处理日志记录:

begin
  foo
rescue PropertyError
  log_err 'Something went wrong'
end

当然,您还可以在异常中存储缺少的属性的名称或其他信息,以提供更有意义的错误/日志消息。