【问题标题】:Ruby ActiveSupport array split vs string splitRuby ActiveSupport 数组拆分与字符串拆分
【发布时间】:2013-11-18 12:14:45
【问题描述】:
"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 错误?

【问题讨论】:

  • 软件将完全按照其编码运行,但可能无法按预期运行。您永远无法通过查看代码来判断某个行为是错误还是规范,但也许可以通过阅读规范来判断。
  • 我添加了文档的链接。那里的示例不包括这种极端情况。

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


【解决方案1】:

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

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

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

另一方面,String#splitRuby core documentation 声明:

如果pattern是一个String,那么它的内容被用作分隔符 拆分 str 时。如果 pattern 是单个空格,则 str 被拆分 空白,带有前导空白和连续空白 字符被忽略。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2015-08-09
    • 2018-06-09
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多