微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以简化这个方法吗?

如何解决可以简化这个方法吗?

我正在使用测试方法在我正在制作的 cli 工具中对方法进行建模,以便单独处理该方法。这是一种非常简单的方法,我正在努力使其尽可能简单。我设法将方法简化为:

LOGS = [{ "first_log" => ["first task"] },{ "second_log" => ["second task"] },{ "third_log" => ["third task","additional task"] }]

LOG_NAME = "second_log" 

def output
  LOGS.each { |log| 
    if LOG_NAME
      puts "-#{log.keys.first.to_s}:"," Tasks: #{log.values.join(",")}" if log.key?(LOG_NAME)
    else
      puts "-#{log.keys.first.to_s}:",")}" 
    end
    }
end

这里的目的是当函数调用时,如果有一个 LOG_NAME 存在,它只输出那个日志(散列对象)和它的任务。如果不存在 LOG_NAME,则输出 LOGS 数组中的所有日志(哈希对象)。

这很好用,但我的问题是:有没有办法让这个方法更简单?我觉得我可以摆脱 if/else 逻辑并进一步简化它,但我无法想象如何。我也尝试过使用 rubocop,但它 1) 建议类似的 if/else 逻辑 2) 建议实际上不输出任何内容的更正。

非常感谢任何想法,谢谢。

解决方法

我认为您可以通过将日志过滤与日志打印分开来改进此代码。这种方法减少了重复,我认为更好地描述了问题。

LOGS = [{ "first_log" => ["first task"] },{ "second_log" => ["second task"] },{ "third_log" => ["third task","additional task"] }]

LOG_NAME = "second_log" 

def output
  LOGS.select { |log|
    LOG_NAME ? log.key?(LOG_NAME) : true
  }.each { |log| puts "-#{log.keys.first.to_s}:"," Tasks: #{log.values.join(",")}"  }
end
,

为什么不直接跳过匹配条件的迭代?

def output
  LOGS.each do |log|
    next if LOG_NAME && log.key?(LOG_NAME)
    puts "-#{log.keys.first.to_s}:",")}" 
  end
end

这使得更容易消化代码,如果 LOG_NAME 和日志的键包含 LOG_NAME 则跳过,否则继续执行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。