Frage

"abc def ".split(" ")

kehrt zurück

["abc", "def"]

So hatte ich erwartet:

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

zurückgeben

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

Aber es kehrte zurück

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

Ich habe den Quellcode durchlesen, der den Split in active_support/core_ext/array/grupping.rb betrifft (ich verwende Activesupport 4.0.0 mit Ruby 2.0.0-p247). Hier finden Sie die 2 Zeilen von DOC: http://api.rubyonrails.org/classes/array.html#method-i-Slit und der Code ist der folgende:

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

Das erklärt, wie es die Spaltung macht.

Ist das das beabsichtigte Verhalten oder ist das ein Activesupport -Fehler?

War es hilfreich?

Lösung

Dies ist wahrscheinlich eher ein beabsichtigtes Verhalten als ein Fehler. Nach der Dokumentation sprengt ein Array:

Teilen Sie das Array in einen oder mehrere Subtarrays, basierend auf einem abgrenzenden Wert oder dem Ergebnis eines optionalen Blocks.

Dies macht keine Garantien für zusammenhängende oder führende Räume.

Andererseits die Ruby Core -Dokumentation zum String#split Zustände:

Wenn das Muster eine Zeichenfolge ist, wird der Inhalt als Trennzeichen verwendet, wenn er Str. Wenn das Muster ein einzelner Raum ist, wird STR auf der Whitespace aufgeteilt, wobei führende Weißespace und mit zusammenhängende Whitespace -Zeichen ignoriert werden.

Wie Sie sehen können, funktioniert das Verhalten, das Sie erwarten, nur mit Whitespace, nicht nur für eine Zeichenfolge.

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

Bei der Aufteilung eines Arrays macht das Konzept von "Whitespace" keinen Sinn mehr. Ich denke also, dass das Verhalten sinnvoll ist, wenn auch vielleicht zuerst nicht intuitiv.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top