जवाबों:
यदि आप बस कुछ मनमानी सूची में शामिल होना चाहते हैं:
"StringA" <> " " <> "StringB"
या बस स्ट्रिंग प्रक्षेप का उपयोग करें:
"#{a} #{b}"
यदि आपकी सूची का आकार मनमाना है:
Enum.join(["StringA", "StringB"], " ")
... उपरोक्त सभी समाधान वापस आ जाएंगे
"StringA StringB"
यदि आपके पास एक मनमानी सूची है, तो आप उपयोग कर सकते हैं Enum.join
, लेकिन अगर यह सिर्फ दो या तीन के लिए है, तो स्पष्ट स्ट्रिंग संघनन को पढ़ना आसान होना चाहिए
"StringA" <> " " <> "StringB"
हालाँकि, अक्सर आपको इसे मेमोरी में सिंगल स्ट्रिंग के रूप में रखने की आवश्यकता नहीं होती है यदि आप इसे उदाहरण के लिए नेटवर्क के माध्यम से आउटपुट करने जा रहे हैं। उस मामले में, एक आईओलिस्ट (एक विशिष्ट प्रकार की गहरी सूची) का उपयोग करना फायदेमंद हो सकता है, जो आपको डेटा की प्रतिलिपि बनाने से बचाता है। उदाहरण के लिए,
iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok
चूँकि आपके पास वे तार कहीं चर के रूप में होंगे, एक गहरी सूची का उपयोग करके, आप इसे कहीं और आउटपुट करने के लिए एक नया स्ट्रिंग आवंटित करने से बचते हैं। अमृत / एरांग में कई कार्य आईओलिस्ट को समझते हैं, इसलिए आपको अक्सर अतिरिक्त काम करने की आवश्यकता नहीं होगी।
एक Enum.reduce आपके उदाहरण के लिए भी काम करेगा नहीं?
iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end)
"StringB StringA"
यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। यदि आप एक नए चर को लिखने का प्रयास कर रहे हैं, तो बस या तो उपयोग करें:
स्ट्रिंग इंटरपोलेशन
a = "StringA"
b = "StringB"
"#{a} #{b}"
स्ट्रिंग संघनन: "StringA" <> " " <> "StringB
Enum.join()
: ["StringA", "StringB"] |> Enum.join(" ")
हालांकि, जैसा कि उरी ने उल्लेख किया है, IOLists का भी उपयोग किया जा सकता है:
["StringA", " ", "StringB"] |> IO.iodata_to_binary
IOLists वास्तव में सबसे अधिक प्रदर्शन करने वाले हैं यदि आपको संसाधन खपत के बारे में ध्यान रखने की आवश्यकता है। बिग नर्ड रेंच का प्रदर्शन लाभ w / IOLists पर एक अच्छा लेखन है ।
कई तरीके हैं, लेकिन यह जानना कि यह कैसे शून्य मानों को संभालता है, यह निर्धारित कर सकता है कि आपको किस विधि का चयन करना चाहिए।
यह एक त्रुटि फेंक देगा
iex(4)> "my name is " <> "adam"
"my name is adam"
iex(1)> "my name is " <> nil
** (ArgumentError) expected binary argument in <> operator but got: nil
(elixir) lib/kernel.ex:1767: Kernel.wrap_concatenation/3
(elixir) lib/kernel.ex:1758: Kernel.extract_concatenations/2
(elixir) lib/kernel.ex:1754: Kernel.extract_concatenations/2
(elixir) expanding macro: Kernel.<>/2
iex:1: (file)
यह सिर्फ एक रिक्त "" स्ट्रिंग डालेगा:
iex(1)> "my name is #{nil}"
"my name is "
जैसा कि यह होगा:
iex(3)> Enum.join(["my name is", nil], " ")
"my name is "
प्रकारों पर भी विचार करें। आपके साथ <>
कोई मुफ्त कास्टिंग नहीं होगी:
iex(5)> "my name is " <> 1
** (ArgumentError) expected binary argument in <> operator but got: 1
(elixir) lib/kernel.ex:1767: Kernel.wrap_concatenation/3
(elixir) lib/kernel.ex:1758: Kernel.extract_concatenations/2
(elixir) lib/kernel.ex:1754: Kernel.extract_concatenations/2
(elixir) expanding macro: Kernel.<>/2
iex:5: (file)
iex(5)> "my name is #{1}"
"my name is 1"
iex(7)> Enum.join(["my name is", 1], " ")
"my name is 1"
व्यवहार में प्रदर्शन लगभग एक जैसा लगता है:
iex(22)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is " <> "adam" end) end)
{8023855, :ok}
iex(23)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is " <> "adam" end) end)
{8528052, :ok}
iex(24)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is " <> "adam" end) end)
{7778532, :ok}
iex(25)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is #{"adam"}" end) end)
{7620582, :ok}
iex(26)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is #{"adam"}" end) end)
{7782710, :ok}
iex(27)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is #{"adam"}" end) end)
{7743727, :ok}
इसलिए, वास्तव में इस बात पर निर्भर करता है कि आप क्रैश करना चाहते हैं या नहीं जब प्रक्षेपित मान nil
या गलत प्रकार हैं।
एक IO सूची का उपयोग करने पर विचार करें, यदि आपके पास ["String1", "string2"] है और आप उस पर iolist_to_binary / 1 का उपयोग करते हैं तो आप उन स्ट्रिंग को एक नए स्ट्रिंग में कॉपी करेंगे। यदि आपके पास एक IO सूची है, तो आप इसे ज्यादातर मामलों में आउटपुट कर सकते हैं और यह इसे पोर्ट पर उपलब्ध कराएगा। और यह एक महत्वपूर्ण बात है, रनटाइम को डेटा की प्रतियां बनाने की आवश्यकता नहीं होगी, इसलिए यह समवर्ती की तुलना में बहुत अधिक कुशल है।
["StringA", "StringB"] |> Enum.join " "