2013-09-16 53 views
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中是不一致的?你對此有何看法?

+0

您使用哪種紅寶石? – Mattherick

+0

你可以看看:http://stackoverflow.com/questions/3568222/array-slicing-in-ruby-looking-for-explanation-for-illogical-behaviour-taken-fr – suvankar

+0

@Mattherick:同樣的行爲在REE和Ruby 2.0 – spickermann

回答

6

按照Ruby String文檔split

如果省略了限制參數,尾隨空字段被抑制。

關於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完成。

+0

有趣,但爲什麼「1 ..」。split(「..」,3)是[「1」,「」]而不是[「1」,「」,「」]]? (ruby 1.9.2p290) – Mattherick

+0

好的,但是如果'「..2」.split('..')'是'['','2']'而不是'[nil,'2']',爲什麼是''1 ..「。split('..')'then'['1',nil]'(然後'nil' ommitted)而不是'['1','']'? – spickermann

+0

@spickermann就是他們選擇實現它的方式。文字沒有說'nil'表示「null」,通常是「空的」('''')。 – lurker