我有几个代码实例,如下所示:
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)还有其他建议吗?
发布于 2018-11-01 07:16:02
一开始不要从街区回来。使用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返回的可能值(缺失属性或nil )中生成find/nil。
发布于 2018-11-01 07:06:45
您可以使用all?枚举数进行检查。只有当所有人都有以下值时,才会返回true:
def checkProperties(properties, to_check)
properties.all? { |p| to_check[p.to_s] && !to_check[p.to_s].blank? }
end如果to_check中的任何一个to_check为零/缺失,all?将返回false并停止在那里进行迭代。
发布于 2018-11-01 09:33:22
还有其他建议吗?
自定义错误类可以工作:
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当然,您还可以将丢失的属性的名称或其他信息存储在异常中,以提供更有意义的错误/日志消息。
https://stackoverflow.com/questions/53096217
复制相似问题