2016-08-31 3 views
5

나는 Elixir에서 enum을 만들고 싶다. 가능한가? 열거 형 (enum)이란 C/C++ 또는 Ruby 또는 다른 많은 언어의 열거 형을 의미합니다. 나는 Enum 모듈을 알고 있지만 모듈은 기능을위한 컨테이너입니다.Enums in Elixir

+0

[목록] (http://elixir-lang.org/getting-started/basic-types.html#linked-lists)과 함께 [Enum 모듈] (http : // elixir -lang.org/getting-started/enumerables-and-streams.html#enumerables). 얼랭 (Erlang)과 같은 엘릭서 (Erix)는 불변의 데이터 타입을 가진 함수형 프로그래밍 언어이므로리스트로 시작하고 변환 (Enum 또는 Stream 모듈을 통해)을 적용한 다음 결정한 결과를 사용할 수 있습니다. –

+0

Ruby에서 enums가 무엇을 의미합니까? Ruby에는 Enumerable과 Enumerator가 있으며, C 나 C++의'enum '과 완전히 다릅니다. – Dogbert

답변

5

원자 만 사용할 수 있습니다. 정적 분석의 경우 특정 값만 허용하는 유형을 정의하여 유형 스펙에서이를 사용할 수 있습니다. 그런 다음 코드를 dialyxir과 같이 확인할 수 있습니다.

@type state :: :a | :b | :c 

@spec set_state(pid, state) :: :ok | {:error, term} 
def set_state(pid, state) 
    # ... 
end 

@spec get_state(pid) :: state 
def get_state(pid) 
    # ... 
end 
+0

그 라이브러리는 라이브러리를 사용하고 싶지 않습니다. –

+0

단지 개발 도구 일 뿐이므로 런타임에는 필요 없으며 컴파일 된 코드에는 흔적이 남지 않습니다. –

3

정확하게 이해하면 엘 릭셔에서 열거 형을 사용하는 방법을 찾고 있습니다. 원자를 키로 사용하여 Map의 인스턴스로이 작업을 수행 할 수 있습니다.

weekdays = [:monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday] 
    |> Enum.with_index 
    |> Map.new 

이상 수동으로

weekdays = %{ 
    monday: 0, 
    tuesday: 1, 
    wednesday: 2, 
    thursday: 3, 
    friday: 4, 
    saturday: 5, 
    sunday: 6} 

당신이 사용하는 경우 조금 :

iex> weekdays.monday 
0 
iex> weekdays.friday 
4 

그러나 일반적으로 다음과 같은 원자를 사용 : 키와 원자, 짧은 손 액세스 구문은 : error 또는 : ok는 이러한 선언을 요구하지 않습니다.

+0

예 .............. –

2

enum이 컴파일시에 적용되는 유형 (예 : c enums)으로 정의 된 정적 사용자를 의미하는 경우 대답은 분명히 아니오입니다.

긴 대답은 Elixir/Erlang의 기본 VM에 고정 된 수의 기본 데이터 유형 만 있다는 것입니다. 기본 데이터 유형은 다음과 같습니다.

및 3 가지 컨테이너 유형.

[Tuple, List, Map] 

당신은 매우 복잡한 데이터 구조를 만들려면 다음 형식을 구성 할 수 있지만, 그 구성 유형의 행동에 "규칙"을 적용 할 경우, 당신은 그 유형을 조작하는 기능의 라이브러리 나 모듈을 작성해야 규칙에 따라.

엘릭서는 동적 언어이므로 모든 복합 데이터 유형에 "도달"하고 완전히 변형 할 수 있습니다. 정의 된 함수 집합을 통해 값을 지정하지 않으면 값에 대한 규칙을 적용 할 수있는 방법이 없습니다. 내 생각 엔 당신이 찾고있는 것은 FixedSet 유형으로 사전 정의 된 값 목록에서만 값을 취할 수있는 것입니다. 모듈로 구현하는 것이 상대적으로 간단하지만, Elixir에서 그러한 종류의 기능을 수행하는 유일한 방법은 함수 모듈 (그리고 아마도 매크로)을 작성하는 것입니다.