2015-01-17 16 views
8

Powiedzmy mam:Jak sprawdzić typ pola struct w eliksiru?

defmodule Operator do 

    defstruct operator: nil 

    @type t :: %Operator { 
     operator: oper 
    } 

    @type oper :: logic | arithmetic | nil 
    @type logic :: :or | :and 
    @type arithmetic :: :add | :mul 

end 

wtedy mogę:

o = %Operator{operator: :and} 

Czy to możliwe, by sprawdzić, czy o.operator jest logic, arithmetic lub nil?

Odpowiedz

8

Typy w eliksiru są adnotacjami, nie można tak naprawdę wchodzić w interakcje z nimi z kodu bez powtarzania ich części. W związku z tym, można napisać:

def operator(%Operator{operator: op}) when op in [:or, :and, :add, :mul, nil] do 
    ... 
end 

lub alternatywnie:

@ops [:or, :and, :add, :mul, nil] 

def operator(%Operator{operator: op}) when op in @ops do 
    ... 
end 
+0

Dziękuję. Pomyślę o pewnym makro, żeby to zrobić. – zie1ony