2009-09-10 24 views
5

मेरे पास एक चर है जिसमें या तो स्ट्रिंग्स की सूची हो सकती है या सिर्फ एक स्ट्रिंग हो सकती है। क्या यह बताने का एक अच्छा तरीका है कि मैं किस तरह से काम कर रहा हूं?मैं कैसे निर्धारित कर सकता हूं कि कोई सूची केवल एक स्ट्रिंग या तारों की सूची है या नहीं?

"192.168.1.18" vs. ["192.168.1.18", "192.168.1.19"] 

किसी भी मामले में मैं शामिल बिट्स का उपयोग करना चाहता हूं।

+1

मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका ऐसी स्थितियों से बचने के लिए है। जैसे तत्वों की एक सूची का उपयोग करें भले ही केवल एक ही हो। या तारों का उपयोग करने के बजाय आईपी को इंगित करने के लिए tuples का उपयोग करें। अस्पष्टता से बचने के लिए हमेशा एक तरीका है – gleber

+0

gleber: सहमत है, लेकिन अब मैं दुर्भाग्य से विरासत कोड से निपट रहा हूं जहां मैं उस तरह के परिवर्तन को पेश नहीं कर सकता – Fylke

उत्तर

5

कैसे आप करते हैं यह आप परिणाम के साथ क्या करने की योजना है, या बल्कि तुम कैसे करते करने की योजना क्या पर बहुत कुछ निर्भर करता है। तो अगर आप बिट्स में रुचि रखते हैं:

case MyVar of 
    [First|Rest] when is_list(First) -> ... First,Rest ...; 
    _ -> ... MyVar ... 
end 

या आप वास्तव में अलग तार की स्ट्रिंग/सूची तुम कर सकते हो खींच में कोई दिलचस्पी नहीं कर रहे हैं:

if is_list(hd(MyVar)) -> ... ; 
    true -> ... 
end 

मैं तुम्हें सही ढंग से समझ में आ यहाँ है? मैंने वास्तव में यह जांचने के लिए कोई कोड नहीं लगाया है कि स्ट्रिंग वास्तव में तार क्या होनी चाहिए, यह पहले किया जाना चाहिए था। एक विकल्प तब होगा जब स्ट्रिंग्स की इस स्ट्रिंग/सूची को हमेशा प्रारूपों में से एक में रखा जाए।

1

मैं कभी कभी की तरह कुछ लिखें:

case X of 
    [List|_] when is_list(List) -> 
     list_of_lists; 
    List when is_list(List) -> 
     list; 
    _ -> 
     not_a_list 
end 
1

एरलांग मॉड्यूल io_lib में एक सूची सूची में एक फ्लैट सूची है या नहीं, यह जांचने के लिए विभिन्न कार्यों को लागू करता है।

अपने खासकर आईपी तार की जाँच के लिए एक अच्छा विकल्प io_lib है: latin1_char_list (टर्म) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib: latin1_char_list/1 समारोह दिया गया है:

latin1_char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 -> 
     latin1_char_list(Cs); 
latin1_char_list([]) -> true; 
latin1_char_list(_) -> false. 

आप फ्लैट यूनिकोड के लिए परीक्षण करना चाहते हैं सूचियों आप io_lib उपयोग कर सकते हैं: char_list (टर्म) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib: char_list/1 समारोह कार्यान्वयन है:

char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800; 
     is_integer(C), C > 16#DFFF, C < 16#FFFE; 
     is_integer(C), C > 16#FFFF, C =< 16#10FFFF -> 
    char_list(Cs); 
char_list([]) -> true; 
char_list(_) -> false. 

अन्य समान कार्यों के लिए io_lib मॉड्यूल दस्तावेज़ देखें।

सूचना है कि कुछ नए erlang समारोह अपने वर्तमान परियोजना का समर्थन किया erlang संस्करण से याद कर रहे हैं अगर आप बस कार्यान्वयन नई erlang संस्करण प्रदान करता है उन्हें कॉपी करके अपने खुद की एक मॉड्यूल में जोड़ सकते हैं। नवीनतम erlang/lib/*/src स्रोत कोड खोजें और बस आपको आवश्यक नए फ़ंक्शंस प्राप्त करें।

संबंधित मुद्दे

 संबंधित मुद्दे