2
"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 行文档: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 错误?

4

1 回答 1

2

这可能是预期的行为而不是错误。根据文档,拆分数组:

根据分隔值或可选块的结果将数组划分为一个或多个子数组。

这不能保证连续或前导空格。

另一方面,状态的Ruby核心文档String#split

如果pattern是一个String,那么它的内容在分割str时作为分隔符。如果 pattern 是单个空格,则 str 在空格上拆分,忽略前导空格和连续空格字符的运行。

如您所见,您期望的行为仅适用于空格,而不适用于任何字符串。

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

拆分数组时,“空白”的概念不再有意义。所以我认为这种行为是明智的,虽然一开始可能违反直觉。

于 2013-11-07T06:31:21.497 回答