【问题标题】:Elixir guard clauses - why can't I put any code in the guard clauses? [duplicate]Elixir 保护条款 - 为什么我不能在保护条款中添加任何代码? [复制]
【发布时间】:2016-09-05 12:44:14
【问题描述】:

为什么我不能将 any 代码添加到 elixir 中的保护子句中?喜欢:

def index(a) when is_list(a) && Enum.all?(a, fn(x) -> x >= 0 end) do

是的,我在 elixir 网站上知道 official guard clauses doc,但没有解释 why 我不能这样做。为什么存在这些关于我可以放置什么来保护子句的限制?

谁能给我解释一下,好吗?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    据我记得读过的是,保护子句的意思就是这样——一段代码,根据给定的参数确定这个函数是否是正确的。

    它不是用来运行计算量大的代码块的地方,而是一种轻量级的检查,可以相对快速地解决对或错的答案。

    例如,使用您提供的代码,如果您的列表有 100 亿个元素,会发生什么情况?编译器必须在执行方法中的代码之前检查列表中的每个元素。现在想象一下,如果你有另一个是

    when Enum.all?(a, &(&1 * 2 > 3))

    然后编译器必须运行两个保护子句并检查列表中的每个元素(如果第一个失败),这基本上需要很长时间。

    【讨论】:

    • 好吧,轻量级的论点很容易被驳倒,因为你可以在 O(n) 的守卫中使用 length/1
    • @Dogbert 是的,我明白你的意思,就像我说的,我不能 100% 确定这是否是原因,我只记得在某处读过它。但是 -> 与例如做相比,长度仍然不是轻量级的。 Enum.all?(a, &(String.jaro_distance("string", &1) > 0.9 ) ?
    • @Dogbert 啊,刚刚看到重复的 Erlang 答案中列出的原因,这比我说的更有意义。
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2017-03-19
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多