为什么我不能将任何代码添加到elixir中的guard子句中?像:
def index(a) when is_list(a) && Enum.all?(a, fn(x) -> x >= 0 end) do
是的,我在elixir网站上了解official guard clauses doc,但没有解释why
我不能这样做。为什么存在这些对我可以保护条款的限制?
有人可以向我解释一下吗?
答案 0 :(得分:1)
从我记忆中读到的是,保护条款就是那个 - 一段代码,根据给定的参数确定这个函数是否是正确的。
这并不意味着一个地方运行计算量很大的代码块,而是一个轻量级的检查,它可以相对快速地解决真或假的答案。
例如,使用您提供的代码,如果您的列表长度为10亿个元素会发生什么?编译器甚至必须在方法中执行代码之前检查列表中的每个元素。现在想象一下,如果你有另一个
when Enum.all?(a, &(&1 * 2 > 3))
。
编译器必须运行两个保护子句并检查列表中的每个元素(如果第一个失败),这基本上需要很长时间。