サーチ…


構文

  • []
  • [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/1to_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"]

リストの理解

エリクサーにはループがありません。リストの代わりに素晴らしいEnumListモジュールがありますが、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と前にdointoシンボル。記号の順序は関係ありません

これらの制約によれば、リスト内包表記は単純な使用のためにのみ制限されています。より高度なケースでは、 EnumListモジュールの関数を使用することが最適です。

リストの違い

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}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow