是否可以简化此方法?
Is it possible to simplify this method?
我正在使用测试方法在我正在制作的 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}:", " Tasks: #{log.values.join(",")}"
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}:", " Tasks: #{log.values.join(",")}"
end
end
如果 LOG_NAME
并且 log 的键中有 LOG_NAME
则跳过,否则继续执行的代码更容易理解。
我正在使用测试方法在我正在制作的 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}:", " Tasks: #{log.values.join(",")}"
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}:", " Tasks: #{log.values.join(",")}"
end
end
如果 LOG_NAME
并且 log 的键中有 LOG_NAME
则跳过,否则继续执行的代码更容易理解。