我有几个看起来像这样的代码实例:
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)
还有其他建议吗?
答案 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
当然,您还可以在异常中存储缺少的属性的名称或其他信息,以提供更有意义的错误/日志消息。