String#拆分奇怪的行为

时间:2013-09-16 13:04:58

标签: ruby

我在split上发现了String方法的奇怪行为。

"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的不一致?你怎么看待这个?

1 个答案:

答案 0 :(得分:6)

根据split的{​​{3}}文档:

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

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

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

示例:

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

"2_3_4_".split('_',4)
=> ["2", "3", "4", ""]
  • 如果limit为零[文档中未提及],则split似乎返回所有已解析的字段,如果存在尾随分隔符,则不会返回尾随空字符串(“”)元素原始字符串。 I.e。,表现得好像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来完成更有用或更有趣的事情。

相关问题