我想做这样的事情:
cust = Repo.get(Customer, id)
case cust do
nil ??? or not nil but is_activated == false && registration_date is over 1 month ago?? -> # something1 .....
custm1 -> # something2
end
如果客户不存在或存在但未激活且,则其注册日期超过1个月前 - >做某事1。如果客户存在 - >做点什么2。如何通过“case”对其进行编码,是否可能?
答案 0 :(得分:1)
我们假设您有一个Customer
结构,而Repo.get(Customer, id)
将返回(或nil
)。您要求的内容如下:
cust = Repo.get(Customer, id)
month_ago = (DateTime.utc_now |> DateTime.to_unix) - 60*60*24*30 # approx. 1 month before now
case cust do
nil ->
something1()
%Customer{is_activated: false, registration_date: regged} when month_ago > regged ->
something1()
_ ->
something2()
end
这是一种不自然的构建IMO的原因是你以相同的方式处理nil
和非零数据的子集。通常情况下,您正在使用case
因为您正在使用您匹配的数据做某事。像:
case cust do
%Customer{is_activated: false, registration_date: regged, email: email} when week_ago > regged ->
send_reminder(email, regged)
%Customer{is_activated: false, registration_date: regged} when month_ago > regged ->
delete_account(cust)
%Customer{is_activated: true, sent_thanks: false, email: email} ->
send_thanks(email)
Repo.update(Customer, %{cust | sent_thanks: true})
end
如果您真正想要的是测试一系列复杂条件,您可能需要一组嵌套if
或cond
:
cust = Repo.get(Customer, id)
cond do
cust == nil ->
something1()
!cust.is_activated && is_old(cust) ->
something1()
true ->
something2()
end
The Elixir documentation提供了有关这种区别的更多示例和解释。