首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化` `if‘块

简化` `if‘块
EN

Stack Overflow用户
提问于 2018-11-01 06:31:01
回答 3查看 78关注 0票数 2

我有几个代码实例,如下所示:

代码语言:javascript
复制
if checkProperties(top_properties, payload) == false
   return false
end

根据某些条件,checkProperties只有一个false返回:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
return false unless checkProperties(top_properties, payload)

还有其他建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-01 07:16:02

一开始不要从街区回来。使用break代替:

代码语言:javascript
复制
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?

代码语言:javascript
复制
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

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2018-11-01 07:06:45

您可以使用all?枚举数进行检查。只有当所有人都有以下值时,才会返回true:

代码语言:javascript
复制
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并停止在那里进行迭代。

票数 1
EN

Stack Overflow用户

发布于 2018-11-01 09:33:22

还有其他建议吗?

自定义错误类可以工作:

代码语言:javascript
复制
class PropertyError < StandardError
end

当遇到丢失的属性时,您可以引发它:

代码语言:javascript
复制
def check_properties(properties, to_check)
  properties.each do |property|
    raise PropertyError if to_check[property.to_s].blank?
  end
end

这将消除对条件和显式返回的需求,您只需调用:

代码语言:javascript
复制
def foo
  check_properties(top_properties, payload)

  # do something with top_properties / payload
end

在“上面”的某个地方你可以处理日志记录:

代码语言:javascript
复制
begin
  foo
rescue PropertyError
  log_err 'Something went wrong'
end

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53096217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档