Question

"abc def ".split(" ")

Retour

["abc", "def"]

Ainsi, je m'attendais:

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

rendre

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

Mais il est revenu

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

J'ai lu le code source faisant la scission dans active_support / core_ext / array / grouping.rb (j'utilise ActiveSupport 4.0.0 avec Ruby 2.0.0-P247). Vous pouvez trouver les 2 lignes de Doc ici: http://api.rubyonrails.org/classes/array.html#method-i-split Et le code est le suivant:

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

Cela explique comment il fait la scission.

Maintenant, est-ce le comportement prévu ou est-ce un bogue ActiveSupport?

Était-ce utile?

La solution

C'est probablement un comportement prévu plutôt qu'un bug. Selon la documentation, diviser un tableau:

Divise le tableau en un ou plusieurs sous-réseaux en fonction d'une valeur de délimitation ou du résultat d'un bloc facultatif.

Cela ne garantit aucune garantie sur les espaces contigus ou leader.

D'un autre côté, le Ruby Core Documentation pour String#split États:

Si le motif est une chaîne, son contenu est utilisé comme délimiteur lors du fractionnement STR. Si le motif est un seul espace, STR est divisé sur les espaces blancs, avec des espaces blancs et des exécutions de caractères blancs d'espace contigu ignoré.

Comme vous pouvez le voir, le comportement que vous attendez ne fonctionne qu'avec Whitespace, pas pour n'importe quelle chaîne.

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

Lorsque vous divisez un tableau, le concept de "Whitespace" n'a plus de sens. Je pense donc que le comportement est raisonnable, si peut-être contre-intuitif au début.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top