2011-06-28 12 views
9

एरलांग में, मैं इसमें स्ट्रिंग को पूर्णांक के साथ प्रारूपित करना चाहता हूं और मैं परिणाम को फ़्लैट करना चाहता हूं।एरलांग में इसमें पूर्णांक वाले फ्लैट स्ट्रिंग को कैसे प्रारूपित किया जाए?

io_lib:format("sdfsdf ~B", [12312]).     
[115,100,102,115,100,102,32,"12312"] 

मैं नीचे दिए गए कोड का उपयोग करके इच्छित परिणाम प्राप्त कर सकते हैं लेकिन यह वास्तव में सुंदर नहीं है: लेकिन मैं इस मिलता है।

lists:flatten(io_lib:format("sdfsdf ~B", [12312])). 
"sdfsdf 12312" 

वहाँ उन में पूर्णांकों के साथ एक बेहतर स्वरूपण तार है, ताकि वे फ्लैट कर रहे हैं? आदर्श रूप से, केवल एक समारोह का उपयोग कर?

उत्तर

6

आपने अपने उदाहरण में किए गए lists:flatten/1 का उपयोग करके एक सूची फ़्लैट की है। तुम क्यों पहली जगह में एक फ्लैट सूची की आवश्यकता

1> list_to_binary(io_lib:format("sdfsdf ~B", [12312])). 
<<"sdfsdf 12312">> 

हालांकि, सवाल:

आप एक द्विआधारी स्वीकार कर सकते हैं, तो list_to_binary/1 काफी कुशल है। अगर यह सिर्फ सौंदर्य प्रसाधन है, तो आपको इसकी आवश्यकता नहीं है। io:format/1,2,3 और अधिकांश अन्य बंदरगाह कार्य (gen_tcp आदि) इतनी गहरी आईओ सूची (अक्षर और बाइनरी साथ नीडिंत सूचियों) कहा जाता है स्वीकार करते हैं: प्रारूप गहरी सूचियों रिटर्न:

2> io:format([115,100,102,115,100,102,32,"12312"]). 
sdfsdf 12312ok 
2

एक दक्षता कारण यह है कि io_lib नहीं है। असल में यह सूचियों के लिए एक कॉल बचाता है: flatten।

अपने आप से पूछें क्यों आप सूची को फ़्लैट करना चाहते हैं। यदि आप सूची मुद्रित करने जा रहे हैं या इसे किसी पोर्ट को भेज रहे हैं या इसे फ़ाइल में लिख रहे हैं, तो ये सभी ऑपरेशन गहरी सूचियां संभालते हैं।

यदि आपको वास्तव में किसी कारण से फ़्लैटेड सूची की आवश्यकता है, तो बस इसे फ़्लैट करें। या आप अपना खुद का my_io_lib बना सकते हैं: प्रारूप जो फ़्लैटेड सूचियों को लौटाता है यदि आपको लगता है कि यह महत्वपूर्ण है।

(आप उसके बाद ही कारणों डीबगिंग के लिए सूची समतल या तो साथ ~ अपने तार प्रिंट, या user_default इस तरह कुछ नामक एक erlang मॉड्यूल में एक flattener बनाना चाहते हैं:।

-module(user_default). 
-compile(export_all). 
%% either this: 
fl(String) -> 
    lists:flatten(String). 
%% or this: 
pp(String) -> 
    io:format("~s~n", [String]). 

तो फिर तुम कर सकते हैं Erlang खोल में fl/1 और प्रिंट/1 का उपयोग करें (जब तक user_default.beam आपके पथ में है)।