проверьте, содержит ли список ключ атома и имеет ли значение

#elixir

Вопрос:

Как мне проверить, существует ли пара ключ-значение в списке?

 options = [symbol: ?|]

args = options[:symbol]

if args[:symbol] and not is_integer(args[:symbol]) do
...
 

Это выдает ошибку
(BadBooleanError) expected a boolean on left-side of "and", got: 124

Ответ №1:

Существует тонкая разница между and/2 и amp;amp;/2 (то же самое относится и к or/2 и ||/2 .) Первый работает с логическими значениями, последний — с truthy и falsey .

Таким образом, можно изменить код на

 if args[:symbol] amp;amp; not is_integer(args[:symbol]), do: ...
 

Но этот код по-прежнему неверен (по крайней мере, он пахнет.) Ключевые слова могут иметь nil s в качестве значений, поэтому необходимо четко различать, имеет nil значение и не имеет значения.

Для этого у нас есть Keyword.has_key?/2 . Тем не менее, правильный код будет:

 if Keyword.has_key?(args, :symbol) and not is_integer(args[:symbol]), do: ...
 

Обратите and/2 внимание здесь; теперь это правильно, потому Keyword.has_key/2 что действительно возвращает логическое значение.