2016-08-31 19 views
5

Elixir'de bir numara oluşturmak istiyorum. Mümkün mü? Enum ile C/C++ veya Ruby'den veya diğer birçok dilde enumları kastediyorum. Enum modülünün farkındayım, ancak bu sadece bir modül - temel olarak fonksiyonlar için bir kap. Yalnızca atom kullanabilirdiniz.Elixir içindeki enumlar

+0

İhtiyacınız olan şey, [Enum modülü] ile birlikte bir [liste] (http://elixir-lang.org/getting-started/basic-types.html#linked-lists) 'dir (http: // elixir -lang.org/getting-started/enumerables-and-streams.html#enumerables). Erlang gibi Elixir, değişmez veri tiplerine sahip fonksiyonel bir programlama dilidir, böylece bir listeyle başlarsınız, dönüşümleri uygulayın (Enum veya Stream modülü ile) ve sonra çıktıyı kullanabilirsiniz, ancak karar verebilirsiniz. –

+0

Ruby'deki enumlarla ne demek istiyorsun? Ruby'de C veya C++ 'da bir' enum'dan tamamen farklı olan Enumerable ve Enumerator var. – Dogbert

cevap

5

Statik analiz için, sadece belirli değerleri kabul eden bir tip tanımlayabilir ve tippec'inizde kullanabilirsiniz. Daha sonra kodunuzu dialyxir ile kontrol edebilirsiniz.

@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

Bu bir kütüphane, kütüphane kullanmak istemiyorum. –

+0

Sadece bir geliştirme aracı olsa da, çalışma zamanında ona ihtiyacınız yok ve derlenmiş kodda hiçbir iz bırakmaz. –

3

Seni doğru anlıyorsam, Elixir'de numaralandırma yöntemini kullanmanın bir yolunu arıyorsun. Bunu bir Harita örneğiyle: atomları anahtar olarak kullanabilirsiniz.

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

Ya da daha elle

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

Eğer kullanıyorsanız biraz:

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

Ama genelde gibi atomlar kullanılarak: tuşları olarak atomlar, kısa el erişim sözdizimi : error or: ok bu bildirimleri yapmanızı gerektirmez.

+0

evet .............. –

2

Sanırım kısa cevap Hayır. Enum ile, derleme zamanında (yani, c enums) zorlanan statik kullanıcı tanımlı türünü kastediyorsunuz, sonra yanıt kesinlikle hayır. Uzun cevap, Elixir/Erlang'ın temel VM'sinde sadece belirli sayıda temel veri tipinin bulunmasıdır. Temel veri türleri vardır:

[Atom, Integer, Float, BitString, Regexp, PID, Function, Reference, Port] 

ve 3 Kapsayıcı türleri.

[Tuple, List, Map] 

Çok karmaşık veri yapılarını oluşturmak için bu tür oluşturabilirsiniz, ancak bu oluşan türlerinin davranışına "kurallar" uygulamak istiyorsanız, o tip manipüle için fonksiyonları bir kitaplık veya modül oluşturmak gerekir kurallara göre.

Elixir dinamik bir dil olduğundan, karmaşık veri türlerine "ulaşmak" ve onu tamamen dönüştürmek her zaman mümkündür. Tanımlanmış işlevler dizisi ile bunu yapmadıkça, değerler üzerinde kuralları zorlamanın bir yolu yoktur. Benim tahminim, aradığınız şeyin sadece önceden tanımlanmış bir değerler listesinden değerler alabilmesi için FixedSet tipi olmasıdır. Bu, bir modül olarak uygulanması nispeten kolay olurdu, ancak bir işlevler modülü (ve muhtemelen bazı makrolar) yazılması, Elixir'de bu tür bir işlevin gerçekleştirilmesinin tek yoludur.