"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错误?
答案 0 :(得分:2)
这可能是预期的行为,而不是错误。根据文档,拆分数组:
根据分隔将数组划分为一个或多个子数组 值或可选块的结果。
这不保证连续或前导空格。
另一方面,String#split
的{{3}}州:
如果pattern是String,则其内容将用作分隔符 分裂str时如果pattern是单个空格,则str被拆分 空白,带有前导空格和连续空格 字符被忽略了。
正如您所看到的,您期望的行为仅适用于空格,而不适用于任何字符串。
"abc ccc def ".split("c")
=> ["ab", " ", "", "", " def "]
分割数组时,“空白”的概念不再有意义。所以我认为这种行为是明智的,如果最初可能是违反直觉的。