Как идиоматически проверить, является ли переменная "ложным" или "не истинным" в Elixir? - PullRequest
0 голосов
/ 25 августа 2018

Я пишу запрос в Фениксе, и мне нужно проверить, где находится поле falsey.

, например, where(query, [x], x is not true)

И, к моему удивлению, информации не так многотам о том, как идиоматически проверять falsey или not true в эликсире.

Просто для большей ясности некоторый псевдокод:

iex(1)> x = nil or x = false
iex(2)> x is not true #desired idiomatic expression
> true

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Я пишу запрос в Фениксе

Нет такого понятия, как «запрос в Феникс ».Запросы [в этом контексте] - это общение с базой данных, и Phoenix в принципе не заботится о базе данных.У кого-то может быть идеальный проект Phoenix , у которого нет базы данных.

Вы запрашиваете Ecto, используя Ecto.Query.

например where(query, [x], x is not true)

Говоря о базе данных, такой запрос имеет небольшой смысл.Базы данных, естественно, не имеют понятия falsey, они различают false и NULL и даже синтаксис SQL кричит как говорящий это.Для нахождения false нужно сделать:

WHERE x = FALSE -- or WHERE x = 0

и для нахождения NULL s

WHERE x IS NULL

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


OTOH, в самом Elixir вопрос совершенно верен.У нас есть два falsey члена: атомы false и nil.Все остальное считается значением truthy.

Чтобы проверить это, следует использовать Kernel.!/1

if !x, do: IO.puts("#{x.inspect} is truthy")
0 голосов
/ 25 августа 2018

Вы можете сделать что-то вроде этого:

x = false

if x do
  "truthy"
else 
  "falsey"
end

=> "falsey"

Это вернет "falsey", если x = nil тоже. Все остальное вернется "truthy"

Сокращение: if x, do: "truthy", else: "falsey"

...