Почему "////'.split('/" ) производит []?

Код '////'.split('/') приводит к []. Хотя я ожидал, что это будет ['', '', '', '', '']. Если это особенность рубина, почему он создан так?

Ответы

Ответ 1

Эта конструкция обеспечивает удобство для разбора строк с конечными разделителями. Например:

'1␣2␣3␣␣'.split('␣') теперь даст ['1', '2', '3'], а не ['1', '2', '3', '', ''].

Эта функция предназначена только для упрощения рабочего процесса.

Однако мне не нравится эта функция, потому что она нарушает чистоту этого метода. Чтобы достичь эффекта выше, вам просто нужно добавить rstrip('␣') между '1␣2␣3␣␣' и split('␣').

Ответ 2

Вы не можете разделить строку разделителей на разделитель.

Вы должны передать предел в качестве второго параметра для разделения функции для достижения этого поведения.

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

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

Ответ 3

Исследование поведения метода split показывает, что оно является результатом оптимизации, оно просто посещает пустые элементы массива после последнего совпадения, как показано ниже:

'////'.split('/')
=> []

'//a//'.split('/')
=> ["", "", "a"]