2013-09-16 5 views
3

Я наблюдал странное поведение метода split на 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? Что ты об этом думаешь?

+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) is ["1", ""], а не ["1", "", ""]? (ruby 1.9.2p290) – Mattherick

+0

Хорошо, но если '' ..2 ".split ('..')' is '['', '2']', а не '[nil, '2']', почему это '' 1 .. ". split ('..')' then '['1', nil]' (а затем 'nil' oletmitted), а не' ['1', ''] '? – spickermann

+0

@spickermann - это то, как они решили его реализовать. Текст не говорит 'nil', он говорит« null », который в общем случае« пуст »(' '' '). – lurker

Смежные вопросы