将新元素添加到列表中

时间:2016-02-20 20:53:16

标签: elixir

我试图将新元素添加到列表中,如下所示:

iex(8)> l = [3,5,7,7,8] ++ 3
[3, 5, 7, 7, 8 | 3]
iex(9)> l
[3, 5, 7, 7, 8 | 3]

为什么我会像

那样进入第五名
8 | 3

它的意思是什么? 如何在列表中添加新元素?

--------的更新 --------
我尝试循环列表如下:

iex(2)> l = [1,2] ++ 3
[1, 2 | 3]
iex(3)> Enum.each(l, fn(x) -> IO.puts(x) end)
1
2
** (FunctionClauseError) no function clause matching in Enum."-each/2-lists^foreach/1-0-"/2
    (elixir) lib/enum.ex:604: Enum."-each/2-lists^foreach/1-0-"(#Function<6.54118792/1 in :erl_eval.expr/5>, 3)
    (elixir) lib/enum.ex:604: Enum.each/2

由于数字2的指针不指向列表,而是指向值3,如何循环列表?

5 个答案:

答案 0 :(得分:42)

只需按照Elixir文档将元素添加到列表中(并记住性能=)):

iex> list = [1, 2, 3]
iex> [0 | list]   # fast
[0, 1, 2, 3]
iex> list ++ [4]  # slow
[1, 2, 3, 4]

https://hexdocs.pm/elixir/List.html

答案 1 :(得分:41)

++运算符用于连接两个列表,然后为了添加新元素,您想要做的就是将它放在列表中。然后,我认为您应该将 3 添加到另一个列表中:

  

IEX(2)&GT; l = [3,5,7,7,8] ++ [3]

     

[3,5,7,7,8,3]

答案 2 :(得分:6)

首先:[1,2] 3]是improper list的表示法。

第二:要使用不正确的列表执行Enum.each,代码看起来像这样:

  

匹配正确/不正确的列表相应容易。那么一个   长度函数len用于正确的列表:

     

len([_ | T]) - &gt; 1 + len(T); len([]) - &gt; 0.我们明确匹配的地方   终止[]。如果给出一个不正确的列表,这将产生一个   错误。而函数last_tail返回a的最后一个尾   list也可以处理不正确的列表:

     

last_tail([_ | T]) - &gt; last_tail(T); last_tail(Tail) - &gt;尾。
  %将匹配任何尾巴

那当然是Erlang code from @rvirding。转换为Elixir并翻译为您在示例中进行的打印,它看起来像这样:

iex(6)> defmodule T do
...(6)>   defp print([h|t]) do
...(6)>     IO.puts(h)
...(6)>     print(t)
...(6)>   end
...(6)>   defp print(t) do
...(6)>     IO.puts(t)
...(6)>   end
...(6)>   def print_improper_list(il), do: print(il)
...(6)> end
iex:6: warning: redefining module T
{:module, T,
 <<70, 79, 82, 49, 0, 0, 5, 136, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 161, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>,
 {:print_improper_list, 1}}
iex(7)> T.print_improper_list([1,2,3|4])
1
2
3
4
:ok

我把它作为练习让你弄清楚如何用Enum.each做到这一点。

答案 3 :(得分:0)

加入Enum.concat

示例:

iex> new_elem = 5
iex> Enum.concat([1, 2, 3], [new_elem])
[1, 2, 3, 5]

答案 4 :(得分:-4)

&#34; I&#34;意味着列表分为头部和尾部,因此[head |尾巴]。如果您以这种方式匹配列表,则可以操作列表的两个部分并使用++运算符进行连接。