如何惯用地检查Elixir中的变量是“ false”还是“ not true”?

时间:2018-08-24 22:32:39

标签: elixir

我正在用Phoenix编写查询,我需要检查字段在[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> VerifyDrinkingWater([System.Web.Http.FromBody] DrinkingWaterModel model) { var successAlert = new AlertModel(); var failureAlert = new AlertModel(); if (ModelState.IsValid) { List<string> successes = new List<string>(); List<string> failures = new List<string>(); foreach (var verifiable in model.Data) { if (verifiable.Verified != false) { verifiable.Verified = true; verifiable.VerifiedDate = DateTime.Now; verifiable.VerifiedBy = User.Identity.Name; var result = await Manager.VerifyAsync(verifiable); } } } else { InvalidState(failureAlert); } //return the GET method to update and refresh the table return await UnverifiedDrinkingWaterLog(successAlert, failureAlert); } 中。

例如falsey

令我惊讶的是,那里没有太多关于如何惯用地检查e剂中的where(query, [x], x is not true)falsey的信息。

只是为了更加清楚一些伪代码:

not true

2 个答案:

答案 0 :(得分:3)

  

我正在凤凰城写一个查询

首先没有“在 Phoenix 中查询”之类的东西。查询(在这种情况下)都是关于与数据库对话,而 Phoenix 基本上可以不关心数据库。一个人可能拥有一个完美的 Phoenix 项目,该项目没有数据库。

您要查询的是Ecto,使用Ecto.Query

  

例如where(query, [x], x is not true)

谈论数据库,这样的查询有点道理。数据库自然没有falsey的概念,它们区分falseNULL,甚至SQL语法也这么喊。要找到false,应该这样做:

WHERE x = FALSE -- or WHERE x = 0

并用于查找NULL

WHERE x IS NULL

也就是说,如果您在数据库中查找 FALSE或NULL 都没有问题,则说明数据库设计存在问题,肯定会在以后给您带来麻烦。


OTOH,在Elixir本身中,这个问题完全正确。我们有两个falsey项:原子falsenil。其他所有内容均视为truthy值。

要进行检查,应使用Kernel.!/1

if !x, do: IO.puts("#{x.inspect} is truthy")

答案 1 :(得分:1)

您可以执行以下操作:

x = false

if x do
  "truthy"
else 
  "falsey"
end

=> "falsey"

如果"falsey"也将返回x = nil。其他所有内容都会返回"truthy"

速记:if x, do: "truthy", else: "falsey"