Ruby中的隐式返回值是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

我是Ruby新手,虽然我觉得它是一种非常直观的语言,但我在理解隐式返回值的行为方面存在一些困难。

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

怎么回事?

提问于
用户回答回答于

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

line.scan(regex).each do |matched|
  output << matched.join("|") << "\n"
end

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

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如果返回的结果数很大(对数组进行处理,然后将它们合并比对单个字符串处理效率更高)。

class LineMatcher
  class << self
    def match(line, regex)
      line.scan(regex).inject("") do |output, matched|
        output << matched.join("|") << "\n"
      end
    end        
  end
end
用户回答回答于

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"]

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

扫码关注云+社区