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