Ruby ActiveSupport数组拆分与字符串拆分

时间:2013-11-07 00:54:28

标签: ruby-on-rails ruby arrays split activesupport

"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)。您可以在此处找到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 个答案:

答案 0 :(得分:2)

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

  

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

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

另一方面,String#split的{​​{3}}州:

  

如果pattern是String,则其内容将用作分隔符   分裂str时如果pattern是单个空格,则str被拆分   空白,带有前导空格和连续空格   字符被忽略了。

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

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

分割数组时,“空白”的概念不再有意义。所以我认为这种行为是明智的,如果最初可能是违反直觉的。