是否可以选择将管道输出插入 Elixir 函数参数的位置?

Is it possible to choose where the pipe output is inserted into Elixir function args?

考虑如下所示的(有异味的、非惯用的)函数:

def update_2d(array, inds, val) do
    [first_coord, second_coord] = inds

    new_arr = List.update_at(array, second_coord, fn(y) ->
      List.update_at(Enum.at(array, second_coord),
        first_coord, fn(x) -> val end) end)
end

此函数将接收一个列表列表、一个包含两个索引的列表以及一个要插入列表列表中索引指定位置的值。

作为使它更像 Elixir-ey 的第一步,我开始铺设管道:

array 
  |> Enum.at(second_coord) 
  |> List.update_at(first_coord, fn(x) -> val end)

这让我了解了大部分内容,但是 如何将该输出通过管道传输到最后一个 List.update_at 调用的匿名函数中? 我可以将它嵌套在原来的电话,但这似乎放弃了:

List.update_at(array, second_coord, fn(y) -> 
  array 
  |> Enum.at(second_coord) 
  |> List.update_at(first_coord, fn(x) -> val end) 
end) 

您可以简单地绑定到一个变量来捕获您的第一个结果,然后在第二个 List.update_at/3 调用中替换它

def update_2d(array, inds = [first_coord, second_coord], val) do
  updated =
    array
    |> Enum.at(second_coord) 
    |> List.update_at(first_coord, fn(x) -> val end)

    List.update_at(array, second_coord, fn(x) -> updated end)
end

您还可以使用 capture 运算符来执行此操作:

  def update_2d(array, inds = [first_coord, second_coord], val), do:    
    array
    |> Enum.at(second_coord) 
    |> List.update_at(first_coord, fn(x) -> val end)
    |> (&(List.update_at(array, second_coord, fn(y) -> &1 end))).()

我发现使用变量更具可读性,但选项就在那里。

怎么样:

{:foo, :bar} |> elem(1) |> Enum.Map(fn x -> x end)

似乎更容易。