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 有这样的控制流程吗?
如果您对返回列表中收集的部分不感兴趣,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