Valores de retorno implícitos en Ruby

Soy un tanto nuevo para Ruby y, aunque me parece un lenguaje muy intuitivo, tengo algunas dificultades para entender cómo se comportan los valores de retorno implícitos.

Estoy trabajando en un pequeño programa para grep los registros de Tomcat y generar archivos CSV delimitados por tuberías a partir de los datos pertinentes. Aquí hay un ejemplo simplificado que estoy usando para generar las líneas de una entrada de registro.

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*?)\]/)

Cuando ejecuto este código, obtengo lo siguiente, que es lo que se espera cuando se devuelve explícitamente el valor de la salida.

00:00:13,207|06/18|0951714636005|20

Sin embargo, si cambio LineMatcher a lo siguiente y no devuelvo explícitamente la salida:

    class LineMatcher
      class << self
        def match(line, regex)
          output = ""
          line.scan(regex).each do |matched|
            output << matched.join("|") << "\n"
          end
        end        
      end
    end

Entonces me sale el siguiente resultado:

00:00:13,207
06/18
0951714636005
20

Obviamente, este no es el resultado deseado. Parece que debería poder deshacerme de la variable de salida, pero no está claro de dónde viene el valor de retorno. Además, cualquier otra sugerencia / mejora para mejorar la legibilidad es bienvenida.

Respuestas a la pregunta(2)

Su respuesta a la pregunta