এলিক্সির স্ট্রিংগুলিতে কীভাবে যোগদান করবেন?


158

একটি স্থানের সাথে তালিকায় আমি দুটি স্ট্রিংকে কীভাবে যুক্ত করব:

["StringA", "StringB"]

হয়ে

"StringA StringB"

উত্তর:


220

আপনি যদি কিছু স্বেচ্ছাসেবীর তালিকায় যোগ দিতে চান:

"StringA" <> " " <> "StringB"

অথবা কেবল স্ট্রিং ইন্টারপোলেশন ব্যবহার করুন:

 "#{a} #{b}"

যদি আপনার তালিকার আকারটি নির্বিচারে হয়:

Enum.join(["StringA", "StringB"], " ")

... উপরের সমস্ত সমাধান ফিরে আসবে

"StringA StringB"

36
পাইপলাইন অপারেটরটি ব্যবহার করে বিকল্প বাক্য গঠন: ["StringA", "StringB"] |> Enum.join " "
রায়ান ক্রমওয়েল

11
পাইপলাইন অপারেটরটি এড়ানো উচিত যখন আপনার যখন পাইপ অপারেশনগুলির আসলে দরকার নেই।
কার্লোস

3
@ এডমেলো কেয়ারটি বিস্তারিতভাবে কেন জানাতে হবে? প্রযুক্তিগতভাবে আপনি পাইপ ক্রিয়াকলাপগুলির সত্যিকার অর্থে কখনই "প্রয়োজন" নন, যেহেতু নীড় ফাংশন কলগুলির মাধ্যমে একই আচরণ অর্জন করা যেতে পারে।
শ্রোকওয়েল

8
@ স্ক্রোকওয়েল হ্যাঁ, "উচিত" খুব বেশি ছিল। আমার অর্থ হ'ল এই ক্ষেত্রে আপনার পঠনযোগ্যতার কোনও লাভ নেই সুতরাং একটি সরল ফাংশন কল ভাবনাকে আরও সুস্পষ্ট করে তুলবে।
কার্লোস

3
সম্ভাব্য নিয়োগকারীদের যে আপনি এটি জানেন তা প্রদর্শনের জন্য আপনার যতটা সম্ভব এলিক্সির ভাষা ব্যবহার করা উচিত। তাই আমি উপরের সমস্ত সমাধান একই ফাইলটিতে ব্যবহার করব।
রডম্যাক্লাগলিন

61

আপনার যা আছে তা যদি একটি স্বেচ্ছাসেবী তালিকা থাকে তবে আপনি এটি ব্যবহার করতে পারেন Enum.joinতবে এটি যদি মাত্র দুই বা তিনটির জন্য হয় তবে স্পষ্টভাবে স্ট্রিং কনকেন্টেশনটি পড়া সহজ হওয়া উচিত

"StringA" <> " " <> "StringB"

যাইহোক, প্রায়শই আপনার যদি মেমরির একক স্ট্রিং হিসাবে এটির প্রয়োজন হয় না যদি আপনি এটি যেমন নেটওয়ার্কের মাধ্যমে আউটপুট যাচ্ছেন to সেক্ষেত্রে কোনও আইওলিস্ট (একটি গভীর ধরণের নির্দিষ্ট ধরণের তালিকা) ব্যবহার করা সুবিধাজনক হতে পারে, যা আপনাকে ডেটা অনুলিপি করা থেকে বাঁচায়। উদাহরণ স্বরূপ,

iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok

যেহেতু আপনার কাছে এই স্ট্রিংগুলি ভেরিয়েবল হিসাবে অন্য কোথাও রয়েছে, একটি গভীর তালিকা ব্যবহার করে, আপনি অন্য কোনও জায়গায় আউটপুট দেওয়ার জন্য একটি সম্পূর্ণ নতুন স্ট্রিং বরাদ্দ করা এড়াবেন। ইলিক্সির / এরং এর অনেকগুলি ক্রিয়া আইওলিস্টগুলি বোঝে, তাই আপনাকে প্রায়শই অতিরিক্ত কাজ করার প্রয়োজন হয় না।


আপনার যদি পাইপ কমান্ড "স্ট্রিং" |> (& ((& 1 <> "
pipe

9

সম্পূর্ণতার জন্য জবাব দেওয়া, আপনি স্ট্রিং ইন্টারপোলেশনও ব্যবহার করতে পারেন :

iex(1)> [a, b] = ["StringA", "StringB"]
iex(2)> "#{a} #{b}"
"StringA StringB"

5

আপনি যদি আপনার তালিকায় একটি স্থান যুক্ত করে ঠিক থাকেন তবে আপনি এটিকে ইওলিস্ট হিসাবে বিবেচনা করতে পারেন:

["StringA", " ", "StringB"] |> IO.iodata_to_binary # "StringA StringB"

আপনি মেমরিতে কোনও স্ট্রিংয়ের সদৃশ করছেন না বলে এটি আপনাকে কিছু পারফরম্যান্স বাড়িয়ে তোলে।


4

একটি এনাম.আরডুস আপনার উদাহরণ নং এর জন্য খুব বেশি কাজ করবে?

iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end) "StringB StringA"


হ্যাঁ, তবে এর জন্য একটি বিপরীত Enum.reduce (["a", "b", "c"] |> Enum.revers, fn (x, acc) -> x <> "" << সমাপ্তি) "আব প্রয়োজন সি "
আন্দ্রে সূরা

ব্যক্তিগতভাবে ভাবেন যে এটি সেরা উত্তর কারণ এটি অন্যান্য ক্ষেত্রে যেখানে হ্রাস ব্যবহার করা যেতে পারে তেমন জেনারেলাইজ করে। আর এর "do.call" ধারণার সাথে কথা বলেছিল
টমাস ব্রাউন

3

এটি আপনি কী করতে চাইছেন তার উপর নির্ভর করে। যদি আপনি কেবল একটি নতুন ভেরিয়েবল লিখতে চেষ্টা করছেন, তবে কেবলমাত্র ব্যবহার করুন:

  • স্ট্রিং বিরতি

    a = "StringA"
    b = "StringB"
    "#{a} #{b}"
    
  • স্ট্রিং উপসংহার: "StringA" <> " " <> "StringB

  • Enum.join(): ["StringA", "StringB"] |> Enum.join(" ")

তবে, উরি যেমন উল্লেখ করেছেন, আইওলিস্টগুলিও ব্যবহার করা যেতে পারে:

["StringA", " ", "StringB"] |> IO.iodata_to_binary

আইএললিস্টরা যদি আপনাকে রিসোর্স খরচ সম্পর্কে যত্ন নেওয়া প্রয়োজন তবে প্রকৃতপক্ষে সবচেয়ে পারফরম্যান্স হতে চলেছে। বিগ এনআরড রাঞ্চের পারফরম্যান্সের লাভ / আইএললিস্ট সম্পর্কে ভাল লেখার ব্যবস্থা রয়েছে।


2

অনেকগুলি পদ্ধতি রয়েছে তবে এটি কীভাবে নীল মানগুলি পরিচালনা করে তা আপনার নির্ধারিত পদ্ধতিটি নির্ধারণ করতে পারে।

এটি একটি ত্রুটি নিক্ষেপ করবে

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বা ভুল ধরণের হয় তা সত্যই নির্ভর করে ।



0

একটি আইও তালিকা ব্যবহার করে বিবেচনা করুন, যদি আপনার ["স্ট্রিং 1", "স্ট্রিং 2"] থাকে এবং আপনি এতে iolist_to_binary / 1 ব্যবহার করেন তবে আপনি সেই স্ট্রিংগুলিকে একটি নতুন স্ট্রিংয়ে অনুলিপি করবেন। আপনার যদি আইও তালিকা থাকে আপনি বেশিরভাগ ক্ষেত্রে কেবল এটিকে আউটপুট দিতে পারেন এবং এটি এটি বন্দরে সংযুক্ত করে তুলবে। এবং এটি মূল বিষয়, রানটাইমের জন্য ডেটার কপিগুলি তৈরি করার প্রয়োজন হবে না তাই এটি কনট্যাক্টেশন এর চেয়ে অনেক বেশি দক্ষ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.