1, "p2" => 1, "p3" => -6ren">
gpt4 book ai didi

variables - 如何在 Elixir 中更新函数内的 bool 变量

转载 作者:行者123 更新时间:2023-12-02 15:15:46 26 4
gpt4 key购买 nike

我是 elixir 的新手,很难更新变量。需要一些帮助。我有两张 map

firstMsg = %{msg: "Hello", vt: %{"p1" => 1, "p2" => 1, "p3" => 1}, from: "p3"}
state = %{ :name => "p2",
vector: %{"p1" => 0, "p2" => 0, "p3" => 0},
participants: ["p1","p3","p2"]
}

我在一个函数中传递这两个映射,它应该根据某些条件返回 true 或 false。

defmodule Testfunc do 
def keep_in_pending(firstMsg, state) do
if (firstMsg.vt[firstMsg.from] == state.vector[firstMsg.from] + 1) do
#IO.puts("Origin proc clock is 1 step ahead from rcvd process Origin clk")
checking = false #initially set this to false
for n <- state.participants do
if n != firstMsg.from do #filter the origin processes
IO.puts("#{n}: #{inspect firstMsg.vt[n]} <= #{n}: #{inspect state.vector[n]} ")
checking = cond do
(firstMsg.vt[n] <= state.vector[n]) -> false
(firstMsg.vt[n] > state.vector[n]) -> true
end
end
end

end
checking
end
end

out = Testfunc.keep_in_pending(firstMsg, state)
IO.puts("#{inspect out}")

它总是给我 false(我最初分配给它的值),并且不更新。我认为变量的范围仅限于内部“if”。谁能给我建议如何重新安排这段代码,以便它返回正确的更新 bool 值?

所以在这种情况下它应该返回 true 因为 firstMsg.vt["p1"] > state.vector["p1"].

最佳答案

欢迎来到 Elixir 。你是对的,这是一个范围问题,但它比这更深入。 Elixir 是一种数据不可变的语言。您不能将 checked 设置为 false,运行一个循环,然后在该循​​环的某处将其设置为 true。这会改变 checked。并不是有人设计了邪恶的范围规则来防止这种情况发生,而是底层虚拟机不会改变状态。

设置一些状态,然后运行改变该状态的过程的编程风格依赖于可变状态。当状态不可变时,循环的替代方法是递归。您在每次递归调用中都携带新状态。

您正在学习一门函数式语言,我认为将您的代码拆分成几个函数会很有帮助。这既能解决您的紧迫问题,又能使您的代码更易于理解。

def keep_in_pending(%{from: from, vt: vt}, %{vector: vector, participants: ps}) do
if vt[from] == vector[from] + 1 do
ps
|> Enum.reject(& &1 == from)
|> check_participants(vector, vt, false)
end
end

def check_participants([], _, _, bool), do: bool
def check_participants([h | t], vector, vt, bool) do
check_participants(t, vector, vt, vt[h] > vector[h])
end

我会简单地解释一下。

首先,请注意我已经对输入进行了模式匹配,以提取我们在函数体中使用的有趣部分。这摆脱了一些重复的 firstMsg.from 业务。 (顺便说一句,snake_case 你的变量名。)

其次,我还没有触及粗糙的外部 if 条件。我根本不知道这是什么意思。您也许应该提取它并给它一个意图显露的名称。

真正的行动在我们引导参与者时开始。您在列表理解中进行过滤。我使用 Enum.reject/1 进行过滤。然后我们将列表传递给递归函数。它会将 bool 值进行到底,从 false 开始。它需要检查 vtvector 中的值,因此它们也被传入。

递归的第一条规则是递归的第一条规则。不,等等。就是思考如何终止递归。我们正在处理一份参与者列表,因此当列表为空时我们将停止。那时,我们已经找到了要查找的 bool 值,因此只需返回它即可。

递归步骤是从列表 (h) 中取出一个项目,用它来确定一个新的 bool 值 (vt[h] > vector[h] ) 并使用列表的其余部分再次调用该函数 (check_participants(t, ...))。

希望对您有所帮助!祝您学习函数式编程愉快!

关于variables - 如何在 Elixir 中更新函数内的 bool 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40708310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com