打破理解

Rig*_*leg 0 list-comprehension elixir control-flow

有没有办法中断理解?

我正在考虑类似 Python 的for- break- else。例如,假设我正在遍历一个整数列表,当我从中生成一个新列表时,我想检查它是否不包含0.

我可以做这样的事情:

for x <- [1, 2, 0, 3] do
    case x do
        0 -> break
        _ -> x
    end
end
if broke do
    :error
else
    :ok
end
Run Code Online (Sandbox Code Playgroud)

我想我想得太重要了,正确的函数方法应该是这样的,带有递归和累加器:

def traverse_and_check(list, acc \\ []) do
    case list do
        [] -> {:ok, reverse(acc)}
        [0 | _tail] -> :error
        [x | tail] -> traverse_and_check(tail, [x | acc])
    end
end
Run Code Online (Sandbox Code Playgroud)

Elixir 有这样的控制流程吗?

Ale*_*kin 6

如果您对返回列表中收集的部分不感兴趣,Elixir 提供throw/catch正是为此目的:

在 Elixir 中,一个值可以被抛出然后被捕获。throwandcatch保留用于除非使用throwand否则无法检索值的情况catch

这些情况在实践中非常罕见,除非与不提供适当 API 的库交互。

我认为这种情况是“不提供适当 API 的库 [here-Elixir]”的完美例子:)

所以给你:

try do
  for x <- [1, 2, 0, 3],
    do: if x == 0, do: throw(:break), else: x
catch
  :break -> :broken
end
#? :broken
Run Code Online (Sandbox Code Playgroud)

请注意,与/不同,throw/catch旨在控制流量。raiserescue