উত্তর:
আপনি যদি কিছু স্বেচ্ছাসেবীর তালিকায় যোগ দিতে চান:
"StringA" <> " " <> "StringB"
অথবা কেবল স্ট্রিং ইন্টারপোলেশন ব্যবহার করুন:
"#{a} #{b}"
যদি আপনার তালিকার আকারটি নির্বিচারে হয়:
Enum.join(["StringA", "StringB"], " ")
... উপরের সমস্ত সমাধান ফিরে আসবে
"StringA StringB"
আপনার যা আছে তা যদি একটি স্বেচ্ছাসেবী তালিকা থাকে তবে আপনি এটি ব্যবহার করতে পারেন Enum.join
তবে এটি যদি মাত্র দুই বা তিনটির জন্য হয় তবে স্পষ্টভাবে স্ট্রিং কনকেন্টেশনটি পড়া সহজ হওয়া উচিত
"StringA" <> " " <> "StringB"
যাইহোক, প্রায়শই আপনার যদি মেমরির একক স্ট্রিং হিসাবে এটির প্রয়োজন হয় না যদি আপনি এটি যেমন নেটওয়ার্কের মাধ্যমে আউটপুট যাচ্ছেন to সেক্ষেত্রে কোনও আইওলিস্ট (একটি গভীর ধরণের নির্দিষ্ট ধরণের তালিকা) ব্যবহার করা সুবিধাজনক হতে পারে, যা আপনাকে ডেটা অনুলিপি করা থেকে বাঁচায়। উদাহরণ স্বরূপ,
iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok
যেহেতু আপনার কাছে এই স্ট্রিংগুলি ভেরিয়েবল হিসাবে অন্য কোথাও রয়েছে, একটি গভীর তালিকা ব্যবহার করে, আপনি অন্য কোনও জায়গায় আউটপুট দেওয়ার জন্য একটি সম্পূর্ণ নতুন স্ট্রিং বরাদ্দ করা এড়াবেন। ইলিক্সির / এরং এর অনেকগুলি ক্রিয়া আইওলিস্টগুলি বোঝে, তাই আপনাকে প্রায়শই অতিরিক্ত কাজ করার প্রয়োজন হয় না।
একটি এনাম.আরডুস আপনার উদাহরণ নং এর জন্য খুব বেশি কাজ করবে?
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(" ")
তবে, উরি যেমন উল্লেখ করেছেন, আইওলিস্টগুলিও ব্যবহার করা যেতে পারে:
["StringA", " ", "StringB"] |> IO.iodata_to_binary
আইএললিস্টরা যদি আপনাকে রিসোর্স খরচ সম্পর্কে যত্ন নেওয়া প্রয়োজন তবে প্রকৃতপক্ষে সবচেয়ে পারফরম্যান্স হতে চলেছে। বিগ এনআরড রাঞ্চের পারফরম্যান্সের লাভ / আইএললিস্ট সম্পর্কে ভাল লেখার ব্যবস্থা রয়েছে।
অনেকগুলি পদ্ধতি রয়েছে তবে এটি কীভাবে নীল মানগুলি পরিচালনা করে তা আপনার নির্ধারিত পদ্ধতিটি নির্ধারণ করতে পারে।
এটি একটি ত্রুটি নিক্ষেপ করবে
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)
এটি কেবল একটি ফাঁকা স্ট্রিং willোকাবে:
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
বা ভুল ধরণের হয় তা সত্যই নির্ভর করে ।
একটি আইও তালিকা ব্যবহার করে বিবেচনা করুন, যদি আপনার ["স্ট্রিং 1", "স্ট্রিং 2"] থাকে এবং আপনি এতে iolist_to_binary / 1 ব্যবহার করেন তবে আপনি সেই স্ট্রিংগুলিকে একটি নতুন স্ট্রিংয়ে অনুলিপি করবেন। আপনার যদি আইও তালিকা থাকে আপনি বেশিরভাগ ক্ষেত্রে কেবল এটিকে আউটপুট দিতে পারেন এবং এটি এটি বন্দরে সংযুক্ত করে তুলবে। এবং এটি মূল বিষয়, রানটাইমের জন্য ডেটার কপিগুলি তৈরি করার প্রয়োজন হবে না তাই এটি কনট্যাক্টেশন এর চেয়ে অনেক বেশি দক্ষ।
["StringA", "StringB"] |> Enum.join " "