Pergunta

"abc def ".split(" ")

retorna

["abc", "def"]

Assim, eu esperava:

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

para retornar

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

mas voltou

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

Eu li o código-fonte fazendo a divisão em active_support/core_ext/array/grouping.rb (estou usando o ActiveSupport 4.0.0 com Ruby 2.0.0-p247).Você pode encontrar as 2 linhas do documento aqui: http://api.rubyonrails.org/classes/Array.html#method-i-split e o código é o seguinte:

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

Isso explica como ocorre a divisão.

Agora, esse é o comportamento pretendido ou é um bug do ActiveSupport?

Foi útil?

Solução

Este é provavelmente um comportamento pretendido e não um bug.De acordo com a documentação, dividindo um array:

Divida a matriz em um ou mais subarrays com base em um valor delimitador ou no resultado de um bloco opcional.

Isso não oferece garantias sobre espaços contíguos ou iniciais.

Por outro lado, o Documentação principal do Ruby para String#split afirma:

Se o padrão for uma corda, seu conteúdo será usado como delimitador ao dividir o STR.Se o padrão é um espaço único, o STR é dividido no espaço em branco, com o espaço em branco e as execuções de caracteres contíguos em branco ignorados.

Como você pode ver, o comportamento esperado funciona apenas com espaços em branco, não com qualquer string.

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

Ao dividir um array, o conceito de "espaço em branco" não faz mais sentido.Portanto, acho que o comportamento é sensato, embora talvez contra-intuitivo a princípio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top