Elixir 长生不老药中的多重if条件
我如何在我的代码中实现多个if条件,如下所示Elixir 长生不老药中的多重if条件,elixir,Elixir,我如何在我的代码中实现多个if条件,如下所示 person = %Person{} if x.name == "Test" do person = %{person | name: "Test"} end if x.age == 50 do person = %{person | age: 50} end 这里的“x”是另一个对象,我试图验证数据,然后相应地更新person结构。 我已经像上面那样写了代码,但是得到了下面的警告 变量“person”是不安全的,因为它被设置在以下其
person = %Person{}
if x.name == "Test" do
person = %{person | name: "Test"}
end
if x.age == 50 do
person = %{person | age: 50}
end
这里的“x”是另一个对象,我试图验证数据,然后相应地更新person结构。
我已经像上面那样写了代码,但是得到了下面的警告
变量“person”是不安全的,因为它被设置在以下其中一个变量中:
case、cond、receive、if和or、&&、|。请明确返回
变量值。例如:
case integer do
1 -> atom = :one
2 -> atom = :two
end
应写为
atom =
case integer do
1 -> :one
2 -> :two
end
不能在块内重新绑定变量。如错误消息所示,将其设置为显式:
person = %Person{}
person = if x.name == "Test", do: %{person | name: "Test"}, else: person
person = if x.age == 50, do: %{person | age: 50}, else: person
即使变量是不可变的,Elixir也允许重新绑定,但如果不允许,则更容易理解(如在Erlang中)。在这种情况下,您必须编写如下内容:
person = %Person{}
person_with_name = if x.name == "Test", do: %{person | name: "Test"}, else: person
person_with_name_and_age = if x.age == 50, do: %{person_with_name | age: 50}, else: person_with_name
不能在块内重新绑定变量。如错误消息所示,将其设置为显式:
person = %Person{}
person = if x.name == "Test", do: %{person | name: "Test"}, else: person
person = if x.age == 50, do: %{person | age: 50}, else: person
即使变量是不可变的,Elixir也允许重新绑定,但如果不允许,则更容易理解(如在Erlang中)。在这种情况下,您必须编写如下内容:
person = %Person{}
person_with_name = if x.name == "Test", do: %{person | name: "Test"}, else: person
person_with_name_and_age = if x.age == 50, do: %{person_with_name | age: 50}, else: person_with_name
当您匹配多个子句以验证字段时,我将组合验证片段的函数,如下所示:
defmodule PersonChecker do
def validate(x, person) do
person
|> validate_name(x)
|> validate_age(x)
end
defp validate_name(person, %{name: name}) when name == "Test" do
%{person | name: "Test"}
end
defp validate_name(person, _x), do: person
defp validate_age(person, %{age: age}) when age == 50 do
%{person | age: 50}
end
defp validate_age(_x, person), do: person
end
如果要使用case
而不是多个validate\u name
函数,它将如下所示:
defp validate_name(person, x) do
case x.name do
"Test" -> %{person | name: "Test"}
_ -> person
end
end
另一方面,根据您的用例,可能更容易使用
x
去掉您不想要的字段,然后使用struct(Person,x)
函数将x
转换为一个结构。当您匹配多个子句以验证字段时,我会组合验证片段的函数,详情如下:
defmodule PersonChecker do
def validate(x, person) do
person
|> validate_name(x)
|> validate_age(x)
end
defp validate_name(person, %{name: name}) when name == "Test" do
%{person | name: "Test"}
end
defp validate_name(person, _x), do: person
defp validate_age(person, %{age: age}) when age == 50 do
%{person | age: 50}
end
defp validate_age(_x, person), do: person
end
如果要使用case
而不是多个validate\u name
函数,它将如下所示:
defp validate_name(person, x) do
case x.name do
"Test" -> %{person | name: "Test"}
_ -> person
end
end
另一方面,根据您的用例,可能更容易使用
x
去掉您不需要的字段,然后使用struct(Person,x)
函数将x
转换为结构。Elixir中的所有内容都是不可变的。我建议您阅读Elixir中关于重新绑定变量的内容
您所追求的功能主要是减少字段列表上的结构,这就是我可能会选择的原因:
defmodule Person,do:defstruct~w | foo name age | a
x=[name:true,age:false]#标志
~w|姓名年龄| a
|>Enum.zip(['Test',50])
|>Enum.reduce(%Person{foo::bar},fn{field,value},acc->
如果x[field],do:%{acc | field=>value},否则:acc
(完)
#⇒%Person{age:nil,foo::bar,name:'Test'}
长生不老药中的一切都是不可变的。我建议您阅读Elixir中关于重新绑定变量的内容
您所追求的功能主要是减少字段列表上的结构,这就是我可能会选择的原因:
defmodule Person,do:defstruct~w | foo name age | a
x=[name:true,age:false]#标志
~w|姓名年龄| a
|>Enum.zip(['Test',50])
|>Enum.reduce(%Person{foo::bar},fn{field,value},acc->
如果x[field],do:%{acc | field=>value},否则:acc
(完)
#⇒%Person{age:nil,foo::bar,name:'Test'}