Зачем мне звездочка перед массивом?

Справка имеет пример для аналогичного варианта использования разных ширины табуляции, см. :help retab-example.

Адаптация этого к пространствам с удвоением / удвоением:

:autocmd BufReadPost,BufWritePost  * %substitute/^\( \+\)\1/\1/e
:autocmd BufWritePre               * %substitute/^ \+/&&/e
13
задан TK. 12 December 2009 в 14:14
поделиться

1 ответ

Оператор splat (то есть * ) превращает то, что в противном случае было бы массивом, в список для присвоения внутри хеша. Вы должны предоставить оператору [] фактический список, чтобы он превратился в пары ключ / значение хэша. (См. Ниже ссылку на краткое описание оператора splat, который на самом деле может делать это (разворачивать массив в список) или наоборот (собирать список в массив).)

Как вы это сделали выше, вы даете Hash [] нечетное количество элементов , а именно один массив. (Подумайте о том, что производит [[: first_name, 'Shane'], [: last_name, 'Harvie']]. Flatten . Результатом является [: first_name, 'Shane',: last_name, ' Havie '] .) Как говорится в цитированных вами документах, оператор [] должен иметь четное число элементов. Обратите внимание, что следующий (хотя и бесполезный) действительно работает :

>> Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten, 1]
=> {[:first_name, "Shane", :last_name, "Harvie"]=>1}

(Мне непонятно, почему вы не получаете ошибку «нечетное количество аргументов для хеширования» при использовании приведенного выше кода - поскольку вы это сделаете, если попробуете Hash [1] .)

Более простой пример может прояснить ситуацию. Сначала передается один элемент, массив. Открытие массива с помощью * для передачи Hash [] списка элементов:

>> Hash[['foo', 'bar', 'bizz', 'buzz']]
=> {}
>> Hash[*['foo', 'bar', 'bizz', 'buzz']]
=> {"foo"=>"bar", "bizz"=>"buzz"}

См. это сообщение в блоге для более полного объяснения. Вы также можете найти эту короткую запись об операторе splat полезной.

)

Более простой пример может прояснить ситуацию. Сначала передается один элемент, массив. Открытие массива с помощью * для передачи Hash [] списка элементов:

>> Hash[['foo', 'bar', 'bizz', 'buzz']]
=> {}
>> Hash[*['foo', 'bar', 'bizz', 'buzz']]
=> {"foo"=>"bar", "bizz"=>"buzz"}

См. это сообщение в блоге для более полного объяснения. Вы также можете найти эту короткую запись об операторе splat полезной.

)

Более простой пример может прояснить ситуацию. Сначала передается один элемент, массив. Открытие массива с помощью * для передачи Hash [] списка элементов:

>> Hash[['foo', 'bar', 'bizz', 'buzz']]
=> {}
>> Hash[*['foo', 'bar', 'bizz', 'buzz']]
=> {"foo"=>"bar", "bizz"=>"buzz"}

См. это сообщение в блоге для более полного объяснения. Вы также можете найти эту короткую запись об операторе splat полезной.

33
ответ дан 1 December 2019 в 19:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: