আমি স্ট্রিংগুলি কীভাবে সংযুক্ত করতে পারি?


195

নিম্নলিখিত ধরণের সংমিশ্রণগুলিকে আমি কীভাবে সম্মতি জানাতে পারি:

  • str এবং str
  • String এবং str
  • String এবং String

13
লক্ষ্য করুন strএবং &strহয় বিভিন্ন ধরনের এবং সময় 99%, আপনি মাত্র যত্ন করা উচিত &str। তাদের মধ্যে পার্থক্য বিশদ সম্পর্কিত অন্যান্য প্রশ্ন রয়েছে।
শেপমাস্টার

উত্তর:


232

আপনি যখন স্ট্রিংগুলি একত্রীকরণ করেন, ফলাফল সংরক্ষণের জন্য আপনাকে মেমরি বরাদ্দ করতে হবে। এর সাথে শুরু করা সবচেয়ে সহজ Stringএবং &str:

fn main() {
    let mut owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    owned_string.push_str(borrowed_string);
    println!("{}", owned_string);
}

এখানে, আমাদের একটি মালিকানাধীন স্ট্রিং রয়েছে যা আমরা পরিবর্তন করতে পারি। এটি দক্ষ কারণ এটি আমাদের মেমরি বরাদ্দ পুনরায় ব্যবহার করতে দেয়। এর জন্য একই রকম কেস রয়েছে Stringএবং Stringযেমনটি &String বিবেচিত হতে পারে&str

fn main() {
    let mut owned_string: String = "hello ".to_owned();
    let another_owned_string: String = "world".to_owned();

    owned_string.push_str(&another_owned_string);
    println!("{}", owned_string);
}

another_owned_stringএটির পরে, কোনও ছোঁয়াচে থাকা (কোনও বাছাইকারী নোট করুন mut)। এর মধ্যে আরও একটি বৈকল্পিক রয়েছে যা গ্রাস করে Stringতবে এটিকে পরিবর্তনের প্রয়োজন হয় না। এটি একটি হল বাস্তবায়ন Addবৈশিষ্ট্য যে একটি লাগে Stringএবং বাম দিকে একটি &strডানদিকে হিসাবে:

fn main() {
    let owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    let new_owned_string = owned_string + borrowed_string;
    println!("{}", new_owned_string);
}

নোট করুন যে owned_stringকল করার পরে আর অ্যাক্সেসযোগ্য নয় +

আমরা যদি উভয়কেই বাতলে না রেখে নতুন স্ট্রিং তৈরি করতে চাই? সবচেয়ে সহজ উপায়টি হ'ল format!:

fn main() {
    let borrowed_string: &str = "hello ";
    let another_borrowed_string: &str = "world";

    let together = format!("{}{}", borrowed_string, another_borrowed_string);
    println!("{}", together);
}

নোট করুন যে উভয় ইনপুট ভেরিয়েবল অপরিবর্তনীয়, তাই আমরা জানি যে সেগুলি স্পর্শ হয়নি। যদি আমরা কোনও সংমিশ্রণের জন্য একই জিনিসটি করতে চাইতাম String, তবে আমরা Stringফর্ম্যাট করতে পারি এমন সত্যটি ব্যবহার করতে পারি:

fn main() {
    let owned_string: String = "hello ".to_owned();
    let another_owned_string: String = "world".to_owned();

    let together = format!("{}{}", owned_string, another_owned_string);
    println!("{}", together);
}

আপনি না আছে ব্যবহার করতে format!যদিও। আপনি একটি স্ট্রিং ক্লোন করতে এবং অন্য স্ট্রিংটিকে নতুন স্ট্রিংয়ের সাথে যুক্ত করতে পারেন:

fn main() {
    let owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    let together = owned_string.clone() + borrowed_string;
    println!("{}", together);
}

দ্রষ্টব্য - আমি যে ধরণের স্পেসিফিকেশনটি দিয়েছি তা সমস্তই রিলান্ডান্ট - সংকলক এখানে খেলার সমস্ত ধরণের অনুমান করতে পারে। আমি এগুলিকে কেবল রাস্টে নতুন লোকদের কাছে পরিষ্কার হওয়ার জন্য যুক্ত করেছি, যেমনটি আমি আশা করি যে এই প্রশ্নটি এই গোষ্ঠীর সাথে জনপ্রিয় হবে!


2
আপনি Add/ +প্রতীক সম্পর্কে কি মনে করেন ? আপনি চাইলে এটি কভার করতে পারেন।
blus

হতে পারে এটি যথেষ্ট সহজ, তবে এটি বোঝার জন্য অ্যাড উইথ স্ট্রিংয়ের জন্য সম্ভাব্য প্রকারের স্বাক্ষরগুলির সন্ধান করা প্রয়োজন।
blus

ধন্যবাদ! আপনি কীভাবে & স্ট্রিংকে একটি & স্ট্রিং হিসাবে চিহ্নিত করতে পারেন তার আরও কিছুটা গভীরতায় যেতে সক্ষম? এর প্রয়োগের কোন অংশ অনুমতি দেয় এবং / অথবা ডকোতে এটি কোথায় বলে?
jsalter

1
@jsalter এটি একটি খুব পৃথক বিষয়, তাই এটি অন্য শীর্ষ-স্তরের প্রশ্ন হিসাবে ভাল হতে পারে। আমি যথাযথ দস্তাবেজের সাথে লিঙ্ক করতে আপডেট করেছি (যতটুকু কাছাকাছি যেতে পারি, কমপক্ষে ...)
শেপমাস্টার

10
@ChrisMorgan এটা অমিল উল্লেখ করা উচিত .to_owned()এবং .to_string()যেহেতু impl বিশেষজ্ঞতা উপরে মন্তব্য ধন্যবাদ সংশোধন করা হয়েছে। এ-তে ডাকলে উভয়েরই এখন একই পারফরম্যান্স &str। প্রাসঙ্গিক প্রতিশ্রুতি: github.com/rust-lang/rust/pull/32586/files
চাদ

49

একক স্ট্রিংয়ে একাধিক স্ট্রিংকে অন্য অক্ষর দ্বারা পৃথক করা, কয়েকটি উপায় রয়েছে।

আমি সবচেয়ে ভাল দেখেছি joinএকটি অ্যারে পদ্ধতি ব্যবহার করা হয় :

fn main() {
    let a = "Hello";
    let b = "world";
    let result = [a, b].join("\n");

    print!("{}", result);
}

আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে আপনি আরও নিয়ন্ত্রণ পছন্দ করতে পারেন:

fn main() {
    let a = "Hello";
    let b = "world";
    let result = format!("{}\n{}", a, b);

    print!("{}", result);
}

আমি আরও কিছু ম্যানুয়াল উপায় দেখেছি, কিছু এখানে এবং সেখানে এক বা দুটি বরাদ্দ এড়ানো হচ্ছে। পাঠযোগ্যতার উদ্দেশ্যে আমি উপরের দুটি যথেষ্ট বলে মনে করি।


joinদলিল কোথায় ? এটি মনে হয় একটি অ্যারে এবং একটি স্ট্রিংয়ের মাঝামাঝি জায়গায় বসে আছে। আমি অ্যারের ডকুমেন্টেশনগুলির মাধ্যমে অনুসন্ধান করেছি এবং দ্রুত বিভ্রান্ত হয়ে পড়েছি ।
ডুয়েন জে

3
@DuaneJ joinআসলে সংযুক্ত বৈশিষ্ট্য । বৈশিষ্ট্যটি অস্থির হিসাবে চিহ্নিত করা হয়েছে তবে এর পদ্ধতিগুলি স্থিতিশীল এবং প্রিলিওডে অন্তর্ভুক্ত রয়েছে যাতে তারা ডিফল্টরূপে সর্বত্র ব্যবহারযোগ্য হয়। দলটি এই বৈশিষ্ট্যটির অস্তিত্বের দরকার নেই বলে ভালভাবে সচেতন বলে মনে হচ্ছে এবং ভবিষ্যতে জিনিসগুলি এর সাথে পরিবর্তিত হবে বলে আমি ধারণা করি। SliceContactExt
সাইমন হোয়াইটহেড

9

আমি মনে করি যে concatপদ্ধতিটি এবং +এখানেও উল্লেখ করা উচিত:

assert_eq!(
  ("My".to_owned() + " " + "string"),
  ["My", " ", "string"].concat()
);

এবং concat!ম্যাক্রো রয়েছে তবে কেবল আক্ষরিক জন্য:

let s = concat!("test", 10, 'b', true);
assert_eq!(s, "test10btrue");

+ইতিমধ্যে একটি বিদ্যমান উত্তরে উল্লেখ করা হয়েছে । ( এটি এমন একটি Addবৈশিষ্ট্যের বাস্তবায়ন Stringযা বাম-হাতের দিক এবং &strডান-হাতের দিক হিসাবে গ্রহণ করে :)
শেপমাস্টার

সত্য, বিদ্যমান উত্তরটি এত বিস্তৃত যদিও আমি লক্ষ্য করি নি।
সুসাইড

6

রুটগুলিতে স্ট্রিংগুলি সংযুক্ত করার সহজ উপায়

স্ট্রিংগুলিকে সংযুক্ত করার জন্য রাস্টে বিভিন্ন পদ্ধতি রয়েছে

প্রথম পদ্ধতি (ব্যবহার concat!()):

fn main() {
    println!("{}", concat!("a", "b"))
}

উপরের কোডটির আউটপুট হল:

AB


দ্বিতীয় পদ্ধতি (ব্যবহার push_str()এবং +অপারেটর):

fn main() {
    let mut _a = "a".to_string();
    let _b = "b".to_string();
    let _c = "c".to_string();

    _a.push_str(&_b);
    
    println!("{}", _a);
 
    println!("{}", _a + &_b);
}

উপরের কোডটির আউটপুট হল:

AB

অ আ ক খ


তৃতীয় পদ্ধতি ( Using format!()):

fn main() {
    let mut _a = "a".to_string();
    let _b = "b".to_string();
    let _c = format!("{}{}", _a, _b);
    
    println!("{}", _c);
}

উপরের কোডটির আউটপুট হল:

AB

এটি পরীক্ষা করে দেখুন এবং মরিচা খেলার মাঠ নিয়ে পরীক্ষা করুন


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