Phoenix 框架:Enum.map 使用 with 语句时。可能吗?
Phoenix Framework : Enum.map while using with statement. Is it possible?
我想使用 with
语句从函数中获取结果。但我想要的正是这个;
对于每一行,我必须验证 role
列并继续,如果列无效我希望函数从 with
语句退出并给出输出 :error
.
下面的代码不起作用,但是否可以做类似的事情?
def get_validation_result(rows) do
with {:ok, "valid"} <- rows
|> Enum.map(fn row ->
role = get_role(row)
validate_role(role)
end) do
{:ok, "valid"}
else
{:error, error} ->
IO.puts :stdio, "invalid"
end
end
你需要的是Enum.reduce_while/3
可以遍历enumerable并在某一点停止
另一方面,with
可以在编写代码时进行分组模式匹配,但没有动态能力。
def validate(rows) do
Enum.reduce_while(rows, :ok, fn row, _ ->
case get_role(row) |> validate_role() do
:ok -> {:cont, :ok}
other -> {:halt, other}
end
end)
end
我想使用 with
语句从函数中获取结果。但我想要的正是这个;
对于每一行,我必须验证 role
列并继续,如果列无效我希望函数从 with
语句退出并给出输出 :error
.
下面的代码不起作用,但是否可以做类似的事情?
def get_validation_result(rows) do
with {:ok, "valid"} <- rows
|> Enum.map(fn row ->
role = get_role(row)
validate_role(role)
end) do
{:ok, "valid"}
else
{:error, error} ->
IO.puts :stdio, "invalid"
end
end
你需要的是Enum.reduce_while/3
可以遍历enumerable并在某一点停止
另一方面,with
可以在编写代码时进行分组模式匹配,但没有动态能力。
def validate(rows) do
Enum.reduce_while(rows, :ok, fn row, _ ->
case get_role(row) |> validate_role() do
:ok -> {:cont, :ok}
other -> {:halt, other}
end
end)
end