Если вы посмотрите на ||, && and !
документацию операторов, вы можете найти:
все значения, кроме false и nil, будут иметь значение true:
iex> false || 11
11
Это означает, что оператор ||
не может быть надежно использован для таких вещей.
В целом, ваш подход неверен, вы должны знать, с какими типами клавиш вы работаете, поскольку существуют преимущества / недостатки использования атомов / strings keys.
Если вы все еще хотите выполнить эту работу, наилучшим подходом было бы создание вспомогательной функции:
def get_key(map, key) when is_map(map) and is_binary(key) do
case map[key] do
nil -> map[String.to_atom(key)]
value -> value
end
end
Однако это все еще не идеально, поскольку ключ атома может также отсутствовать, и вы получите ноль.