Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药中的多重if条件_Elixir - Fatal编程技术网

Elixir 长生不老药中的多重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”是不安全的,因为它被设置在以下其

我如何在我的代码中实现多个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”是不安全的,因为它被设置在以下其中一个变量中: 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'}