[英]Elixir ensure value is not 0 or nil
在此函数中,我需要先通过“ priceFloat = price / 1
”检查“ price”变量是否为0或nil,然后再将其转换为浮点数,否则会出现算术错误。
def insert_product_shop(conn, product_id, shop_id, price) do
IO.inspect(price, label: "price")
priceFloat = price / 1
changeset = Api.ProductShop.changeset(%Api.ProductShop{p_id: product_id, s_id: shop_id, not_in_shop_count: 0, price: priceFloat})
errors = changeset.errors
valid = changeset.valid?
case insert(changeset) do
{:ok, product_shop} ->
{:ok, product_shop}
{:error, changeset} ->
{:error, :failure}
end
end
什么是惯用的方式?
我尝试了这个,但仍然收到算术错误:
def insert_product_shop(conn, product_id, shop_id, price) do
IO.inspect(price, label: "price")
case {price} do
{price} when price > 0 ->
priceFloat = price / 1
changeset = Api.ProductShop.changeset(%Api.ProductShop{p_id: product_id, s_id: shop_id, not_in_shop_count: 0, price: priceFloat})
errors = changeset.errors
valid = changeset.valid?
case insert(changeset) do
{:ok, product_shop} ->
{:ok, product_shop}
{:error, changeset} ->
{:error, :failure}
end
end
end
您的代码不起作用的原因是因为在Elixir中, nil > 0
为true。 您可以改为:
if price not in [0, nil] do
...
else
...
end
要么
if is_number(price) and price > 0 do
...
else
...
end
惯用的方法是直接在函数子句中进行模式匹配:
def insert_product_shop(conn, product_id, shop_id, price)
when not is_number(price), do: {:error, :nil}
def insert_product_shop(conn, product_id, shop_id, price)
when price <= 0, do: {:error, :not_positive}
def insert_product_shop(conn, product_id, shop_id, price) do
priceFloat = price / 1
changeset =
Api.ProductShop.changeset(
%Api.ProductShop{p_id: product_id,
s_id: shop_id,
not_in_shop_count: 0,
price: priceFloat})
errors = changeset.errors
valid = changeset.valid?
case insert(changeset) do
{:ok, product_shop} ->
{:ok, product_shop}
{:error, changeset} ->
{:error, :failure}
end
end
前两个子句可能在有警卫的情况下合为一体
when not is_number(price) or price <= 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.