Pregunta

"abc def ".split(" ")

devoluciones

["abc", "def"]

Por lo tanto, esperaba:

["a", "b", "c", " ", "d", "e", "f", " "].split(" ")

regresar

[["a", "b", "c"], ["d", "e", "f"]]

Pero volvió

[["a", "b", "c"], ["d", "e", "f"], []]

Leí el código fuente haciendo la división en Active_Support/Core_ext/Array/Grouping.RB (estoy usando ActiveSupport 4.0.0 con Ruby 2.0.0-P247). Puedes encontrar las 2 líneas de Doc aquí: http://api.rubyonrails.org/classes/array.html#method-i-split y el código es el siguiente:

def split(value = nil, &block)
    inject([[]]) do |results, element|
      if block && block.call(element) || value == element
        results << []
      else
        results.last << element
      end

      results
    end
  end

Eso explica cómo se divide.

Ahora, ¿es ese el comportamiento previsto o es que un error de ActiveSupport?

¿Fue útil?

Solución

Probablemente sea un comportamiento previsto en lugar de un error. Según la documentación, dividir una matriz:

Divide la matriz en una o más subarrañas en función de un valor delimitador o el resultado de un bloque opcional.

Esto no garantiza los espacios contiguos o principales.

Por otro lado, el Documentación del núcleo de Ruby por String#split Estados:

Si el patrón es una cadena, entonces su contenido se usa como delimitador al dividir STR. Si el patrón es un solo espacio, STR se divide en espacios en blanco, con espacios en blanco líder y carreras de personajes de espacios blancos contiguos ignorados.

Como puede ver, el comportamiento que espera solo funciona con Whitespace, no para cualquier cadena.

 "abc ccc def ".split("c")
 => ["ab", " ", "", "", " def "]

Al dividir una matriz, el concepto de "espacio en blanco" ya no tiene sentido. Así que creo que el comportamiento es sensato, si tal vez al principio contradictorio al principio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top