Elixir Language
リスト
サーチ…
構文
- []
- [1,2,3,4]
- [1,2] ++ [3,4] - > [1,2,3,4]
- hd([1、2、3、4])#→1
- t1([1,2,3,4])#→[2,3,4]
- [ヘッド|尾]
- [1 | [2,3,4]]#→[1,2,3,4]
- [1 | [2 | [3 | [4 | []]]]] - > [1,2,3,4]
- 'hello' = [?h、?e、?l、?l、o]
- keyword_list = [a:123、b:456、c:789]
- keyword_list [:a]# - > 123
キーワードリスト
キーワードリストは、リストの各項目がアトムのタプルの後に値が続くリストです。
keyword_list = [{:a, 123}, {:b, 456}, {:c, 789}]
キーワードリストを記述するための簡略表記は、次のとおりです。
keyword_list = [a: 123, b: 456, c: 789]
キーワードリストは、順序付けされたキーと値のペアのデータ構造を作成するのに便利です。ここでは、指定されたキーに対して複数の項目が存在することがあります。
特定のキーのキーワードリストの最初の項目は、次のように取得できます。
iex> keyword_list[:b]
456
キーワードリストのユースケースは、実行する名前付きタスクのシーケンスです。
defmodule TaskRunner do
def run_tasks(tasks) do
# Call a function for each item in the keyword list.
# Use pattern matching on each {:key, value} tuple in the keyword list
Enum.each(tasks, fn
{:delete, x} ->
IO.puts("Deleting record " <> to_string(x) <> "...")
{:add, value} ->
IO.puts("Adding record \"" <> value <> "\"...")
{:update, {x, value}} ->
IO.puts("Setting record " <> to_string(x) <> " to \"" <> value <> "\"...")
end)
end
end
このコードは次のようなキーワードリストで呼び出すことができます:
iex> tasks = [
...> add: "foo",
...> add: "bar",
...> add: "test",
...> delete: 2,
...> update: {1, "asdf"}
...> ]
iex> TaskRunner.run_tasks(tasks)
Adding record "foo"...
Adding record "bar"...
Adding record "test"...
Deleting record 2...
Setting record 1 to "asdf"...
文字リスト
Elixirの文字列は "バイナリ"です。しかし、Erlangコードでは、文字列は伝統的に "char list"なので、Erlang関数を呼び出すときは、通常のElixir文字列の代わりにcharリストを使用する必要があります。
通常の文字列は二重引用符を使用して書かれていますが"
、char型のリストは、単一引用符を使用して書かれています'
。
string = "Hello!"
char_list = 'Hello!'
文字リストは、各文字のコードポイントを表す整数の単なるリストです。
'hello' = [104, 101, 108, 108, 111]
文字列は、 to_charlist/1
をto_charlist/1
してcharリストに変換できます。
iex> to_charlist("hello")
'hello'
そして逆はto_string/1
行うことができます:
iex> to_string('hello')
"hello"
Erlang関数を呼び出し、出力を通常のElixir文字列に変換する:
iex> :os.getenv |> hd |> to_string
"PATH=/usr/local/bin:/usr/bin:/bin"
コンスセル
エリクシールのリストはリンクされたリストです。これは、リスト内の各項目が値で構成され、その後にリスト内の次の項目へのポインタが続くことを意味します。これはコンスセルを使ってElixirに実装されています。
コンスセルは、「左」と「右」の値、または「頭」と「尾」の値を持つ単純なデータ構造です。
|
記号は、リスト内の最後の項目の前に追加して、指定された頭と尾を持つ(不適切な)リストにすることができます。以下は頭が1
、尾が2
コンスセルです。
[1 | 2]
リストの標準的なElixir構文は、実際にネストされたコンスセルのチェーンを書くことと同じです:
[1, 2, 3, 4] = [1 | [2 | [3 | [4 | []]]]]
空リスト[]
は、リストの終わりを表すコンスセルの末尾として使用されます。
Elixirのすべてのリストは、 [head | tail]
、 head
はリストの最初の項目、 tail
はリストの残りの部分から頭を引いたものです。
iex> [head | tail] = [1, 2, 3, 4]
[1, 2, 3, 4]
iex> head
1
iex> tail
[2, 3, 4]
[head | tail]
表記は、再帰関数のパターンマッチングに役立ちます。
def sum([]), do: 0
def sum([head | tail]) do
head + sum(tail)
end
マッピングリスト
map
は、関数と関数を与えられた関数型プログラミングの関数であり、その関数をそのリストの各項目に適用して新しいリストを返します。 Elixirでは、 map/2
関数はEnumモジュールにあります。
iex> Enum.map([1, 2, 3, 4], fn(x) -> x + 1 end)
[2, 3, 4, 5]
匿名関数の代替キャプチャ構文の使用:
iex> Enum.map([1, 2, 3, 4], &(&1 + 1))
[2, 3, 4, 5]
キャプチャ構文を持つ関数を参照する:
iex> Enum.map([1, 2, 3, 4], &to_string/1)
["1", "2", "3", "4"]
パイプ演算子を使用したリスト操作の連鎖:
iex> [1, 2, 3, 4]
...> |> Enum.map(&to_string/1)
...> |> Enum.map(&("Chapter " <> &1))
["Chapter 1", "Chapter 2", "Chapter 3", "Chapter 4"]
リストの理解
エリクサーにはループがありません。リストの代わりに素晴らしいEnum
とList
モジュールがありますが、List Comprehensionsもあります。
リストの理解は、以下の目的に役立ちます。
- 新しいリストを作成する
iex(1)> for value <- [1, 2, 3], do: value + 1
[2, 3, 4]
-
guard
式を使用してリストをフィルタリングしますが、キーワードを指定しないwhen
guard
式を使用します。
iex(2)> odd? = fn x -> rem(x, 2) == 1 end
iex(3)> for value <- [1, 2, 3], odd?.(value), do: value
[1, 3]
- キーワードを使っ
into
カスタムマップを作成する:
iex(4)> for value <- [1, 2, 3], into: %{}, do: {value, value + 1}
%{1 => 2, 2=>3, 3 => 4}
結合された例
iex(5)> for value <- [1, 2, 3], odd?.(value), into: %{}, do: {value, value * value}
%{1 => 1, 3 => 9}
概要
リスト内包:
-
for..do
構文を使用し、コンマの後にガードが追加into
、リスト以外の構造を返すときinto
キーワードにinto
ます。地図。 - それ以外の場合は新しいリストを返す
- アキュムレータはサポートしていません
- 特定の条件が満たされたときに処理を停止できません
-
guard
文は、後の順序で最初にする必要がfor
と前にdo
かinto
シンボル。記号の順序は関係ありません
これらの制約によれば、リスト内包表記は単純な使用のためにのみ制限されています。より高度なケースでは、 Enum
とList
モジュールの関数を使用することが最適です。
リストの違い
iex> [1, 2, 3] -- [1, 3]
[2]
--
右の各アイテムの左リスト上のアイテムの最初の出現を削除します。
メンバーシップの一覧
要素がリストのメンバーであるかどうかを確認するにin
演算子で使用in
ます。
iex> 2 in [1, 2, 3]
true
iex> "bob" in [1, 2, 3]
false
リストをマップに変換する
使用Enum.chunk/2
サブリストにグループ化要素に、そしてMap.new/2
地図に変換します:
[1, 2, 3, 4, 5, 6]
|> Enum.chunk(2)
|> Map.new(fn [k, v] -> {k, v} end)
与える:
%{1 => 2, 3 => 4, 5 => 6}