Найти в Дзене
Vim

VimScript 38 [ словари ]

Оглавление

| ч37. циклы | Содержание | ч39 переключатель |

Словари создаются с использованием фигурных скобок. Словарь состоит из ключа и значения которое соответствует ключу.

Ключ всегда преобразуются в строку, а значения могут быть различны. Что бы в этом убедиться. Выполните эту команду:

:echo {'a': 1, 100: 'foo'}

На выходе получаем: {'a': 1, '100': 'foo'}

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

:echo {'a': 1, 100: 'foo',}

На выходе получаем: {'a': 1, '100': 'foo'}

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

Индексирование

Для поиска значения по ключу в словаре используется тот же синтаксис, что и в большинстве языков. Выполните эту команду:

:echo {'a': 1, 100: 'foo',}['a']

На выходе получаем: 1

Vim выводит значение 1 ключа 'а'. Попробуйте использовать не строковый индекс.

:echo {'a': 1, 100: 'foo',}[100]

На выходе получаем: foo

Перед выполнением поиска Vim приведет индекс к строке, это имеет смысл, поскольку ключи могут быть только строками.

Vimscript также поддерживает "точечный" поиск в стиле Javascript, когда ключ представляет собой строку, состоящую только из букв, цифр и / или символов подчеркивания. Попробуйте выполнить следующие команды:

:echo {'a': 1, 100: 'foo',}.a
:echo {'a': 1, 100: 'foo',}.100

На выходе получаем: 1 затем foo

Vim правильно отобразит правильное значение в обоих случаях. Как вы будите индексировать свои словари, зависит от вкуса и стиля.

Определение и добавление

Определение словарей выполняется простым назначением их как переменных. Выполните эту команду:

:let foo = {'a': 1}
:let foo.a = 100
:let foo.b = 200
:echo foo

На выходе получаем: {'a': 100, 'b': 200}

Вначале мы определили наш список. :let foo = {'a': 1} а затем добавили в него новый ключ (b) и значение(200) :let foo.b = 200

Удаление записей

Есть два способа удалить записи из словаря. Выполните следующие команды:

:let test = remove(foo, 'a')
:unlet foo.b
:echo test
:echo foo

На выходе получаем: 100 и {}

Функция remove удалит из словаря ключ и значение, но при этом вернет значение ключа 100. Команда unlet также удаляет запись из словаря, но при этом ничего не возвращает, поэтому вы не можете использовать значение.

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

:unlet foo["asdf"]

На выходе получаем: Ошибка

Что выбрать remove или unlet?

Это в основном зависит от личного вкуса. Я бы рекомендовал использовать remove везде, потому что он более гибкий, чем unlet с remove можно делать все что и с unlet, но обратное неверно.

Функции словаря

Как и списки, Vim имеет ряд встроенных функций для работы со словарями. Выполните следующую команду:

:echom get({'a': 100}, 'a', 'default')
:echom get({'a': 100}, 'b', 'default')

На выходе получаем: 100, default

Функция get работает так же как и в списках.

Вы также можете проверить, присутствует ли данный ключ в данном словаре. Запустите эти команды:

:echom has_key({'a': 100}, 'a')
:echom has_key({'a': 100}, 'b')

На выходе получаем: 1 и 0

Помните? Vim обрабатывает 1 как истину и 0 как ложь.

Вы так же можете получить список списков с парами ключ-значение из словаря с помощью items. Выполните эту команду:

:echo items({'a': 100, 'b': 200})

На выходе получаем: [['a',100], ['b',200]]

На выходе вы получите список списков с парами ключ значение. Но, упорядоченность этих списков не гарантируется.

Вы можете получить список только ключей или только значений с помощью функций keys и values . Они работают так, как ожидалось - посмотрите их.

Упражнения

Прочти :help Dictionary. Обратите внимание на заглавную букву D.

Прочти :help get().

Прочти :help has_key().

Прочти :help items().

Прочти :help keys().

Прочти :help values().

| ч37. циклы | Содержание | ч39 переключатель |