Elixir

2016-08-31 13 views
5

में Enums मैं Elixir में एक enum बनाना चाहता हूँ। क्या यह संभव है? Enum से मेरा मतलब सी/सी ++ या रूबी या कई अन्य भाषाओं में enums है। मुझे Enum मॉड्यूल के बारे में पता है लेकिन यह केवल एक मॉड्यूल है - मूल रूप से कार्यों के लिए एक कंटेनर।Elixir

+0

आपको [सूची] (http://elixir-lang.org/getting-started/basic-types.html#linked-lists) के साथ [एनम मॉड्यूल] के साथ एक आवश्यकता है [http: // elixir -lang.org/getting-started/enumerables-and-streams.html#enumerables)। एर्लिक्स जैसे एलीक्सिर एक कार्यात्मक प्रोग्रामिंग भाषा है जो अपरिवर्तनीय डेटा प्रकारों के साथ है, इसलिए आप एक सूची से शुरू होते हैं, ट्रांसफॉर्मेशन लागू करते हैं (एनम या स्ट्रीम मॉड्यूल के माध्यम से) और फिर आप आउटपुट का उपयोग कर सकते हैं हालांकि आप निर्णय लेते हैं। –

+0

रूबी में enums द्वारा आपका क्या मतलब है? रुबी में संख्यात्मक और गणनाकर्ता है जो सी या सी ++ में 'एनम' से बिल्कुल अलग है। – 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

यदि मैं आपको सही ढंग से समझता हूं, तो आप एलिक्सीर में गणना का उपयोग करने का एक तरीका ढूंढ रहे हैं। आप इसे मानचित्र के उदाहरण के साथ कर सकते हैं: परमाणुओं के रूप में परमाणु।

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 

लेकिन आम तौर पर इस तरह के रूप परमाणुओं का उपयोग कर : त्रुटि या: ठीक है आपको इन घोषणाओं को करने की आवश्यकता नहीं है।

+0

हां .............. –

2

मुझे लगता है कि संक्षिप्त उत्तर संख्या है। अगर एनम द्वारा, आप का मतलब है कि एक स्थिर उपयोगकर्ता संकलित समय पर लागू प्रकार परिभाषित किया गया है, (यानी सी enums), तो उत्तर निश्चित रूप से नहीं है।

लंबा उत्तर यह है कि एलिक्सीर/एरलांग के अंतर्निहित वीएम में केवल कुछ निश्चित डेटा प्रकार हैं। मूल डेटा प्रकार हैं:

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

और 3 कंटेनर प्रकार।

[Tuple, List, Map] 

आप बहुत जटिल डेटा संरचनाओं बनाने के लिए इन प्रकार बना सकता है, लेकिन अगर आप उन बना प्रकार के व्यवहार के लिए "नियम" लागू करना चाहते हैं, तो आप उन प्रकार के जोड़ तोड़ के लिए एक पुस्तकालय या कार्यों का मॉड्यूल बनाने की जरूरत नियमों के अनुसार।

चूंकि इलीक्सिर एक गतिशील भाषा है, इसलिए किसी भी जटिल डेटा प्रकार में "पहुंचने" और पूरी तरह से इसे बदलने के लिए हमेशा संभव है। मूल्यों पर नियमों को लागू करने का कोई तरीका नहीं है जबतक कि आप परिभाषित कार्यों के एक सेट के माध्यम से ऐसा नहीं करते हैं। मेरा अनुमान है कि आप जो खोज रहे हैं वह FixedSet प्रकार है जो मूल्यों की पूर्व परिभाषित सूची से मूल्य ले सकता है। यह एक मॉड्यूल के रूप में लागू करने के लिए अपेक्षाकृत सरल होगा, लेकिन कार्यों का एक मॉड्यूल लिखना (और संभवतः कुछ मैक्रोज़) एलीक्सिर में उस तरह की कार्यक्षमता को पूरा करने का एकमात्र तरीका है।