3

我观察到该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中的不一致?你怎么看?

4

1 回答 1

6

根据Ruby String文档split

如果省略了 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

于 2013-09-16T13:11:09.237 回答