Вопрос

"abc def ".split(" ")

возврат

["abc", "def"]

Таким образом, я ожидал:

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

вернуться

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

Но он вернулся

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

Я прочитал исходный код, выполняя разделение в Active_Support/core_ext/array/Grouping.rb (я использую ActiveSupport 4.0.0 с Ruby 2.0.0-P247). Вы можете найти 2 строки DOC здесь: http://api.rubyonrails.org/classes/array.html#method-i-split и код является следующим:

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

Это объясняет, как это делает раскол.

Теперь это предполагаемое поведение или это ошибка ActiveSport?

Это было полезно?

Решение

Это, вероятно, предполагаемое поведение, а не ошибка. Согласно документации, разделение массива:

Делит массив на один или несколько субрайров на основе значения разграничения или результата дополнительного блока.

Это не дает никаких гарантий о смежных или ведущих пространствах.

С другой стороны, Рубиновая основная документация за String#split состояния:

Если шаблон является строкой, то его содержимое используется в качестве разделителя при разделении Str. Если шаблон представляет собой одно пространство, STR разделен на пробел, с ведущими пробелами и игнорируемыми непрерывными персонажами отдачи.

Как вы можете видеть, поведение, которое вы ожидаете, работает только с пробелом, а не для любой строки.

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

При разделении массива концепция «пробела» на самом деле больше не имеет смысла. Поэтому я думаю, что поведение является разумным, если, возможно, противоречит сначала.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top