2015-04-24 3 views
1

Исследовать:Почему разделение строк непоследовательно?

"test.one.two".split(".") # => ["test", "one", "two"] 

Право, совершенным. Именно то, что мы хотим.

"test..two".split(".") # => ["test", "", "two"] 

Я заменил one с пустой строкой, так что имеет смысл

"test".split(".") # => ["test"] 

Вот что я бы ожидать, никаких проблем здесь.

".test".split(".") # => ["", "test"] 

Да, моя строка имеет один ., так что я получил две секции в результате.

"test.".split(".") # => ["test"] 

Что? В моей строке есть ., она должна быть разделена на две части. Я не просил избавиться от пустых струн; это не избавиться от пустых строк обратно в тестах 2 или 4.
я ожидал бы ["test", ""]

"".split(".") # => [] 

ЧТО? Это должно работать почти точно как испытание 3, и возвращает [""]. Но теперь я не могу выполнить какие-либо строковые методы на result[0]

Почему это противоречиво для разделов, которые встречаются на краях или для пустой строки?

+0

Чтобы получить все части в 5, необходимо передать параметр 'split':' "test.". Split (".", -1) # ⇒ ["test", ""] '. Пустая строка всегда разделяется на пустой массив. – mudasobwa

+0

@ mudasobwa Я знаю, мой вопрос * почему *. Пустой тест строки ведет себя непоследовательно с тестом 3. –

+1

from docs _ Когда входная строка пуста, возвращается пустой массив, поскольку в строке считается, что поля не разделены. – tihom

ответ

6

документация объясняет это так: http://ruby-doc.org/core-2.2.0/String.html#method-i-split

Если параметр предел опущен, замыкающие нулевые поля подавляются. Если предел является положительным числом, то будет возвращено не более полей (если лимит равен 1, вся строка возвращается как единственная запись в массиве). Если значение отрицательное, то число возвращаемых полей не ограничено, а завершающие нулевые поля не подавляются .

Таким образом, это делает то, что можно было ожидать:

"test.".split(".", -1) 
=> ["test", ""] 

Остальное есть в документации.

+0

Даже с параметром '-1' пустая строка разбивается неправильно; '" ".split (". ", -1) # => []'. Но даже если документация детализирует это поведение, я хотел бы знать * почему *; это противоречит ИМО. –

+0

В касательной связи точка, имеющая отрицательный параметр, вздор. Для вас было бы более целесообразно передать необязательный хэш с параметрами 'suppress_trailing_null_fields: false' или что-то в этом роде.Наличие отрицательного числа полей не интуитивно означает это. Хотя я понимаю значение принятия целого числа на своем месте. –

+0

В этот момент вы можете захотеть пойти по каналам irc канала рубинового ядра и спросить, почему они так его спроектировали. – DiegoSalazar

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