首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby中的隐式返回值

Ruby中的隐式返回值
EN

Stack Overflow用户
提问于 2009-06-30 14:59:26
回答 2查看 22.2K关注 0票数 19

我对Ruby有些陌生,虽然我发现它是一种非常直观的语言,但我很难理解隐式返回值的行为。

我正在开发一个小程序,用于grep Tomcat日志,并从相关数据生成以竖线分隔的CSV文件。下面是一个简化的示例,我使用该示例从日志条目生成行。

代码语言:javascript
复制
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*?)\]/)

当我运行这段代码时,我得到了以下结果,这是显式返回输出的值时所期望的结果。

代码语言:javascript
复制
00:00:13,207|06/18|0951714636005|20

但是,如果我将LineMatcher更改为以下内容,并且没有显式返回输出:

代码语言:javascript
复制
    class LineMatcher
      class << self
        def match(line, regex)
          output = ""
          line.scan(regex).each do |matched|
            output << matched.join("|") << "\n"
          end
        end        
      end
    end

然后我得到以下结果:

代码语言:javascript
复制
00:00:13,207
06/18
0951714636005
20

显然,这不是预期的结果。我感觉我应该能够去掉output变量,但是不清楚返回值来自哪里。此外,欢迎对可读性提出任何其他建议/改进。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-30 15:25:49

拼音中的任何语句都会返回上次计算的表达式的值。您需要了解最常用方法的实现和行为,以便准确了解您的程序将如何运行。

#each返回您迭代的集合。也就是说,下面的代码将返回line.scan(regexp)的值。

代码语言:javascript
复制
line.scan(regex).each do |matched|
  output << matched.join("|") << "\n"
end

如果您想返回执行的结果,您可以使用map,它作为each工作,但返回修改后的集合。

代码语言:javascript
复制
class LineMatcher
  class << self
    def match(line, regex)
      line.scan(regex).map do |matched|
        matched.join("|")
      end.join("\n") # remember the final join
    end        
  end
end

根据您的具体情况,您可以使用几种有用的方法。在这种情况下,您可能希望使用inject,除非scan返回的结果数量很多(处理数组,然后合并它们比处理单个字符串效率更高)。

代码语言:javascript
复制
class LineMatcher
  class << self
    def match(line, regex)
      line.scan(regex).inject("") do |output, matched|
        output << matched.join("|") << "\n"
      end
    end        
  end
end
票数 25
EN

Stack Overflow用户

发布于 2009-06-30 15:10:43

在ruby中,方法的返回值是最后一条语句返回的值。你也可以选择显式返回。

在您的示例中,第一个代码片段返回字符串output。然而,第二个代码片段返回由each方法(现在是最后一个stmt)返回的值,结果是一个匹配数组。

代码语言:javascript
复制
irb(main):014:0> "StackOverflow Meta".scan(/[aeiou]\w/).each do |match|
irb(main):015:1* s << match
irb(main):016:1> end
=> ["ac", "er", "ow", "et"]

更新:然而,这仍然不能在一行上解释您的输出。我认为这是一个格式错误,它应该在不同的行上打印每个匹配项,因为这就是puts打印数组的方式。一小段代码就能比我更好地解释它。

代码语言:javascript
复制
irb(main):003:0> one_to_three = (1..3).to_a
=> [1, 2, 3]
irb(main):004:0> puts one_to_three
1
2
3
=> nil

就我个人而言,我发现带有显式返回的方法更具可读性(在本例中)

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

https://stackoverflow.com/questions/1064159

复制
相关文章

相似问题

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