수색…


통사론

  • []
  • [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 목록을 사용해야 할 수도 있습니다.

일반 문자열을 큰 따옴표를 사용하여 작성하는 동안 " , 문자 목록은 작은 따옴표를 사용하여 작성 ' :

string = "Hello!"
char_list = 'Hello!'

문자 목록은 각 문자의 코드 포인트를 나타내는 정수 목록입니다.

'hello' = [104, 101, 108, 108, 111]

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"

셀 단점

엘릭서 목록은 링크 된 목록입니다. 즉, 목록의 각 항목은 값과 목록의 다음 항목을 가리키는 포인터로 구성됩니다. 이것은 엘릭시르에서 단락 셀을 사용하여 구현됩니다.

Cons 셀은 "왼쪽"과 "오른쪽"값 또는 "머리"와 "꼬리"가있는 단순한 데이터 구조입니다.

A | 기호는 주어진 머리와 꼬리가있는 (부적절한) 목록을 표기하기 위해 목록의 마지막 항목 앞에 추가 될 수 있습니다. 다음은 머리가 1 이고 꼬리가 2 단일 단락 셀입니다.

[1 | 2]

리스트의 표준 엘릭서 구문은 실제로 중첩 된 단락 셀의 체인을 작성하는 것과 같습니다.

[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도 있습니다.

List Comprehensions은 다음과 같은 경우에 유용합니다.

  • 새 목록 만들기
iex(1)> for value <- [1, 2, 3], do: value + 1
[2, 3, 4] 
  • , 목록을 필터링하여 guard 표현을하지만 당신은하지 않고 사용할 when 키워드.
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 키워드를 목록 이외의 다른 구조를 반환 할 때 사용합니다. 지도.
  • 다른 경우에는 새 목록을 반환합니다.
  • 축전지를 지원하지 않습니다.
  • 특정 조건이 충족 될 때 처리를 중지 할 수 없습니다.
  • guard 문은 후 순서대로 먼저해야 할 for 및 이전 dointo 상징. 기호의 순서는 중요하지 않습니다.

이러한 제약 사항에 따라 목록 내재는 단순한 사용에만 제한됩니다. EnumList 모듈의 함수를 사용하는 고급 사례의 경우 가장 좋은 아이디어입니다.

차이점 목록

iex> [1, 2, 3] -- [1, 3]
[2]

-- 오른쪽의 각 항목에 대해 왼쪽 목록에서 항목의 첫 번째 항목을 제거합니다.

회원 명부 작성

사용 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