使用管道运算符时如何访问列表的各个元素?

时间:2016-10-31 17:39:15

标签: elixir

我正在通过管道运算符发送一个列表,并希望对单个元素执行某些操作。但不知道如何访问每个元素。这是一个例子

[1,[[2],3]] |> List.flatten |> &(&1 * 2).()
[1,[[2],3]] |> List.flatten |> (fn(x)-> x*2 end).()

尝试了其他一些不起作用的变体。我在这里遗漏了一些非常重要的东西。

$string = 'http://www.example.com/result/سوتی/?foo=علی&bar=حسن';
$string = urlencode($string);
echo str_replace(array('%3A', '%2F', '%3F', '%3D', '%26'), array(':', '/', '?', '=', '&'), $string);

1 个答案:

答案 0 :(得分:2)

您正在寻找Enum.map/2

[1,[[2],3]]
|> List.flatten
|> Enum.map(&(&1 * 2))    # => [2, 4, 6]

另一个选择是使用Enum.each/2,当你有"做某事时#34;使用列表项而不返回任何内容。

了解管道运营商

从您的问题来看,我也觉得您并不完全了解如何使用管道操作员。使用Pipe运算符,您可以“#34; feed"将前一个语句的结果作为第一个参数传入下一个函数。

来自Elixir网站:

  

<强> Enumerables and Streams - The Pipe Operator

     

[管道运算符]从左侧的表达式获取输出,并将其作为第一个参数传递给右侧的函数调用。它类似于Unix |运营商。其目的是突出显示由一系列功能转换的数据

以下是一个例子:

list = [1,[[2],3]]
flattened_list = List.flatten(list)
doubled_list = Enum.map(flattened_list, fn i -> i*2 end)

使用Pipe运算符时,它看起来像这样:

[1,[[2],3]]
|> List.flatten
|> Enum.map(fn i -> i*2 end)