【问题标题】:String#split strange behavior [duplicate]String#split 奇怪的行为[重复]
【发布时间】:2013-09-16 13:04:58
【问题描述】:

我在String 上观察到split 方法的奇怪行为。

"1..2".split('..')      # => ['1', '2']
"1..2".split('..', 2)   # => ['1', '2']

"..2".split('..')       # => ['', '2']
"..2".split('..', 2)    # => ['', '2']

一切都像预期的那样,但现在:

"1..".split('..')       # => ['1']
"1..".split('..', 2)    # => ['1', '']

我希望第一个返回与第二个相同的返回值。

谁有好的解释,为什么"1..".split('..') 返回一个只有一个元素的数组?还是Ruby中的不一致?你怎么看?

【问题讨论】:

标签: ruby


【解决方案1】:

根据Ruby Stringsplit 的文档:

如果省略 limit 参数,则抑制尾随的空字段。

关于limit 参数,Ruby 文档并不完整。这里有更多细节:

  • 如果limit 是正数,split 最多返回该数量的字段。返回数组的最后一个元素是“字符串的其余部分”,或者如果字段数少于 limit 并且原始字符串中有尾随分隔符,则为单个空字符串 ("")。

例子:

"2_3_4_".split('_',3)
=> ["2", "3", "4_"]

"2_3_4_".split('_',4)
=> ["2", "3", "4", ""]
  • 如果limit 为零[未在文档中提及],split 似乎返回所有已解析的字段,并且如果原始字符串中有尾随分隔符,则没有尾随空字符串 ("") 元素。 ,它的行为就像limit 不存在一样。 (它可以作为默认值实现。)

例子:

"2_3_4_".split('_',0)
=> ["2", "3", "4"]
  • 如果limit 为负数,则split 返回所有已解析的字段,如果原始字符串中有尾随分隔符,则返回一个尾随空字符串元素。

例子:

"2_3_4".split('_',-2)
=> ["2", "3", "4"]

"2_3_4".split('_',-5)
=> ["2", "3", "4"]

"2_3_4_".split('_',-2)
=> ["2", "3", "4", ""]

"2_3_4_".split('_',-5)
=> ["2", "3", "4", ""]

似乎可以用否定的limit 来做一些更有用或更有趣的事情。

【讨论】:

  • 有趣,但为什么 "1..".split("..", 3) 是 ["1", ""] 而不是 ["1", "", ""]? (红宝石 1.9.2p290)
  • 好的,但是如果"..2".split('..')['', '2'] 而不是[nil, '2'],为什么是"1..".split('..') 然后是['1', nil](然后是nil 省略)而不是['1', '']?跨度>
  • @spickermann 这就是他们选择实现它的方式。文本没有说nil,它说“null”,通常是“空”('')。
  • @Mattherick 这是一个有趣的实现细节,文档中没有说明。对于肯定的limit,它仅表示“最多”将提供许多字段。一个更有趣的问题是:为什么负限制不限制所选字段的数量并且不抑制单个空值? 0 的限制已经产生了没有尾随空值的所有字段,如果有尾随分隔符,正限制提供单个空值。那么为什么不使用负限制作为提供所有空值的方法呢?一个 Ruby 库的怪癖。 :)
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 2021-09-23
  • 2015-05-29
  • 2016-03-02
  • 1970-01-01
  • 2013-06-28
  • 2015-07-26
相关资源
最近更新 更多