我对 Ruby 有点陌生,虽然我发现它是一种非常直观的语言,但我很难理解隐式返回值的行为方式。
我正在开发一个小程序来 grep Tomcat 日志并从相关数据生成管道分隔的 CSV 文件。这是我用来从日志条目生成行的简化示例。
class LineMatcher
class << self
def match(line, regex)
output = ""
line.scan(regex).each do |matched|
output << matched.join("|") << "\n"
end
return output
end
end
end
puts LineMatcher.match("00:00:13,207 06/18 INFO stateLogger - TerminationRequest[accountId=AccountId@66679198[accountNumber=0951714636005,srNumber=20]",
/^(\d{2}:\d{2}:\d{2},\d{3}).*?(\d{2}\/\d{2}).*?\[accountNumber=(\d*?),srNumber=(\d*?)\]/)
当我运行此代码时,我会返回以下内容,这是显式返回输出值时所期望的。
00:00:13,207|06/18|0951714636005|20
但是,如果我将 LineMatcher 更改为以下内容并且不明确返回输出:
class LineMatcher
class << self
def match(line, regex)
output = ""
line.scan(regex).each do |matched|
output << matched.join("|") << "\n"
end
end
end
end
然后我得到以下结果:
00:00:13,207
06/18
0951714636005
20
显然,这不是我们想要的结果。感觉我应该能够摆脱输出变量,但不清楚返回值来自哪里。此外,欢迎任何其他关于可读性的建议/改进。