Почему "////'.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"]