質問

"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でsplitを実行するソースコードを読み上げます(Ruby 2.0.0-P247でActivesupport 4.0.0を使用しています)。ここで2行のドキュメントを見つけることができます: 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

それはそれがどのように分割されるかを説明しています。

さて、それは意図された動作ですか、それともActiveSupportのバグですか?

役に立ちましたか?

解決

これはおそらくバグではなく、意図された動作です。ドキュメントによると、配列を分割します。

区切り値またはオプションのブロックの結果に基づいて、配列を1つ以上のサブアレイに分割します。

これは、隣接するまたは主要なスペースについて保証するものではありません。

一方、 Ruby Coreドキュメント 為に String#split 州:

パターンが文字列の場合、その内容はstrを分割するときに区切り文字として使用されます。パターンが単一のスペースの場合、STRは空白に分割され、主要な空白と連続した空白のキャラクターの走行が無視されます。

ご覧のとおり、予想される動作は、文字列だけではなく、Whitespaceでのみ機能します。

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

アレイを分割するとき、「Whitespace」の概念はこれ以上意味がありません。ですから、おそらく最初は直感に反する場合、行動は賢明だと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top