문제

"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에서 분할을 수행하는 소스 코드를 읽습니다 (Ruby 2.0.0-P247과 함께 ActivesUpport 4.0.0을 사용하고 있습니다). 두 줄의 문서를 여기에서 찾을 수 있습니다. 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

그것은 그것이 어떻게 분할을하는지 설명합니다.

이제, 그게 의도 된 행동입니까, 아니면 Actives Uppport 버그입니까?

도움이 되었습니까?

해결책

이것은 아마도 버그가 아닌 행동 의도 일 것입니다. 문서에 따르면 배열 분할 :

구분 값 또는 옵션 블록의 결과에 따라 배열을 하나 이상의 서브 어레이로 나눕니다.

이것은 연속 또는 선행 공간에 대해 보장하지 않습니다.

반면에 루비 코어 문서 ~을 위한 String#split 상태 :

패턴이 문자열 인 경우 STR을 분할 할 때 내용이 구분기로 사용됩니다. 패턴이 단일 공간 인 경우, STR은 공백에서 분할되며, 선행 공백과 인접한 공백 문자가 무시됩니다.

보시다시피, 당신이 기대하는 동작은 어떤 문자열도 아닌 공백에서만 작동합니다.

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

배열을 분할 할 때 "공백"의 개념은 더 이상 의미가 없습니다. 그래서 나는 아마도 처음에는 반 직관적이라면 행동이 합리적이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top