В Vimscript, как пропустить элементы в назначении деструктурирования из списка? - PullRequest
1 голос
/ 01 марта 2020

В Vimscript есть что-то вроде деструктурирующего назначения для списков. Например:

:let [a,b,c] = [1,2,3]

Что, если мне не важен первый элемент, но я все еще хочу связать b и c? Есть ли какой-нибудь «подстановочный знак», который я могу использовать, чтобы не давать имя 1?

Ответы [ 2 ]

4 голосов
/ 01 марта 2020

Возможным решением является использование регистра черной дыры:

let [@_,b,c]=[1,2,3]

Кажется, что вы можете использовать его более одного раза без проблем:

let [@_,@_,c]=[1,2,3]

См. :h "_.

1 голос
/ 01 марта 2020

Просто присвойте этим полям имя переменной, чтобы было ясно, что вы игнорируете эти значения. Переменная _ является отличным соглашением для этого.

let [_, b, c] = [1, 2, 3]

Или, чтобы игнорировать первые два термина:

let [_, _, c] = [1, 2, 3]

Обратите внимание, что вы можете использовать его более одного раза в :let-unpack назначение.

В некоторых языках, таких как Python, специальная переменная _, в которой назначения к ней нигде не сохраняются. В Vimscript это не так, переменная с таким именем допустима и существует. Но если вы выполняете это назначение изнутри функции (что, вероятно, имеет место), тогда область действия переменной будет ограничена этой функцией, и загрязнение пространства имен не должно иметь значения.


Вот реальный пример использования из хорошо известного подключаемого модуля vim-figitive от tpope:

let [_, to, changes; __] = matchlist(a:line, '^ \(.\{-\}\) \+|\zs \(.*\)$')

Обратите внимание, что он использует синтаксис ; для игнорирования всех полей четвертого и далее (это полезно знать при распаковке больших списков.) Он использует _ для игнорирования первого поля и __ для игнорирования остальных. (Обратите внимание, что использование _ для обоих также было бы хорошо.)

В документации Vim также есть ссылки на использование _ в качестве имени для переменной, которую следует игнорировать. Для примера использования map():

Если вы не используете «ключ», вы можете использовать короткое имя:

call map(myDict, {_, val -> 'item: ' . val})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...