Elixir-구조체

구조체는 컴파일 시간 확인 및 기본값을 제공하는 맵 위에 빌드 된 확장입니다.

구조체 정의

구조체를 정의하기 위해 defstruct 구조체가 사용됩니다.

defmodule User do
   defstruct name: "John", age: 27
end

defstruct와 함께 사용되는 키워드 목록은 기본값과 함께 구조체가 가질 필드를 정의합니다. 구조체는 정의 된 모듈의 이름을 사용합니다. 위에 주어진 예에서 우리는 User라는 구조체를 정의했습니다. 이제 맵을 만드는 데 사용 된 것과 유사한 구문을 사용하여 User 구조체를 만들 수 있습니다.

new_john = %User{})
ayush = %User{name: "Ayush", age: 20}
megan = %User{name: "Megan"})

위의 코드는 값이있는 세 가지 다른 구조체를 생성합니다.

%User{age: 27, name: "John"}
%User{age: 20, name: "Ayush"}
%User{age: 27, name: "Megan"}

구조체는 defstruct를 통해 정의 된 필드 (및 모든 필드) 만 구조체에 존재할 수 있도록 컴파일 타임 보장을 제공합니다. 따라서 모듈에서 구조체를 만든 후에는 자신의 필드를 정의 할 수 없습니다.

구조체 액세스 및 업데이트

지도에 대해 논의 할 때지도의 필드에 액세스하고 업데이트하는 방법을 보여주었습니다. 동일한 기술 (및 동일한 구문)이 구조체에도 적용됩니다. 예를 들어, 이전 예제에서 생성 한 사용자를 업데이트하려면-

defmodule User do
   defstruct name: "John", age: 27
end
john = %User{}
#john right now is: %User{age: 27, name: "John"}

#To access name and age of John, 
IO.puts(john.name)
IO.puts(john.age)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

John
27

구조체의 값을 업데이트하기 위해 맵 장에서 사용한 것과 동일한 절차를 다시 사용합니다.

meg = %{john | name: "Meg"}

구조체는 특정 키의 값을 일치시키고 일치하는 값이 일치하는 값과 동일한 유형의 구조 체인지 확인하기 위해 패턴 일치에도 사용할 수 있습니다.