我在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的不一致?你怎么看待这个?
答案 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
来完成更有用或更有趣的事情。