私は次のように新しい要素をリストに追加しようとしました:
iex(8)> l = [3,5,7,7,8] ++ 3
[3, 5, 7, 7, 8 | 3]
iex(9)> l
[3, 5, 7, 7, 8 | 3]
なぜ私は5番目の位置に着いたのですか
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を指しているのではないので、どのようにリストをループできますか?
++演算子は2つのリストを連結するためのもので、新しい要素を追加するために何をしたいのかをリスト内に配置することです。次に、を別のリストに追加する必要があると思います。
iex(2)> l = [3,5,7,7,8] ++ [3]
[3、5、7、7、8、3]
Elixirのドキュメントに従って、リストに要素を追加してください(パフォーマンスに留意してください=))。
iex> list = [1, 2, 3]
iex> [0 | list] # fast
[0, 1, 2, 3]
iex> list ++ [4] # slow
[1, 2, 3, 4]
最初:[1、2 | 3]は 不適切なリスト の表記です。
2番目:不適切なリストを使用してEnum.eachを実行するには、コードは次のようになります。
適切/不適切なリストとの照合は、それに応じて簡単です。したがって、適切なリストの長さ関数len:
len([_ | T])-> 1 + len(T); len([])-> 0.ここで、終端の[]に明示的に一致します。不適切なリストを指定すると、エラーが生成されます。リストの最後の末尾を返す関数last_tailは、不適切なリストも処理できます。
last_tail([_ | T])-> last_tail(T); last_tail(Tail)->テール。
%任意のテールに一致します
つまり、 @ 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でこれを行う方法を理解するための演習として残しておきます。