#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
что действительно возвращает логическое значение.