"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中进行拆分的源代码(我正在使用ActiveIveSupport 4.0.0使用Ruby 2.0.0.0-p247)。您可以在此处找到两行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

这解释了它如何进行分裂。

现在,这是预期的行为还是ActiveSudiveSupport错误?

有帮助吗?

解决方案

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

根据划界值或可选块的结果将阵列分为一个或多个子阵列。

这不能保证连续或领先的空间。

另一方面, 红宝石核心文档 为了 String#split 状态:

如果图案是字符串,则在拆分str时将其内容用作定界符。如果图案是单个空间,则str在空格上分开,领先的空格和连续的空格字符忽略了。

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

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

当分裂数组时,“空格”的概念实际上不再有意义。因此,我认为这种行为是明智的,即使起初也许是违反直觉的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top