Add<char> for String
প্রমিত লাইব্রেরিতে ইমপ্লিট যোগ করার চেষ্টা করার সময় আমি এই সমস্যাটি জুড়ে এসেছি । তবে আমরা অপারেটর শেনিনিগান ছাড়াই এটি সহজেই প্রতিলিপি করতে পারি। আমরা এটি দিয়ে শুরু করি:
trait MyAdd<Rhs> {
fn add(self, rhs: Rhs) -> Self;
}
impl MyAdd<&str> for String {
fn add(mut self, rhs: &str) -> Self {
self.push_str(rhs);
self
}
}
যথেষ্ট সহজ। এটি দিয়ে নিম্নলিখিত কোডগুলি সংকলন করে:
let a = String::from("a");
let b = String::from("b");
MyAdd::add(a, &b);
নোট করুন যে এই ক্ষেত্রে, দ্বিতীয় আর্গুমেন্ট এক্সপ্রেশন ( &b
) এর ধরণ রয়েছে &String
। এরপরে এটি ডেরেফ-জোর করা হয় &str
এবং ফাংশন কলটি কাজ করে।
তবে , আসুন নিম্নলিখিত ইমপ্লিট যুক্ত করার চেষ্টা করুন:
impl MyAdd<char> for String {
fn add(mut self, rhs: char) -> Self {
self.push(rhs);
self
}
}
এখন MyAdd::add(a, &b)
উপরের অভিব্যক্তিটি নিম্নলিখিত ত্রুটির দিকে পরিচালিত করে:
error[E0277]: the trait bound `std::string::String: MyAdd<&std::string::String>` is not satisfied
--> src/main.rs:24:5
|
2 | fn add(self, rhs: Rhs) -> Self;
| ------------------------------- required by `MyAdd::add`
...
24 | MyAdd::add(a, &b);
| ^^^^^^^^^^ the trait `MyAdd<&std::string::String>` is not implemented for `std::string::String`
|
= help: the following implementations were found:
<std::string::String as MyAdd<&str>>
<std::string::String as MyAdd<char>>
কেন এমন? আমার কাছে মনে হচ্ছে ডেরেফ-জবরদস্তি কেবল তখনই করা হয় যখন কেবলমাত্র একটি ফাংশন প্রার্থী থাকে। তবে এটি আমার কাছে ভুল বলে মনে হচ্ছে। নিয়ম কেন এমন হবে? আমি স্পেসিফিকেশনটি সন্ধান করার চেষ্টা করেছি, তবে আমি তর্ক করার মতো কিছু খুঁজে পাইনি।
impl
প্রয়োগ হয়, তখন এটি এতে ব্যবহৃত ধরণের যুক্তি চয়ন করে ছিন্ন করতে পারেimpl
। অন্যান্য প্রশ্নোত্তরে আমি এই দক্ষতাটিimpl
কল সাইটে একটি সংকলক (উপস্থিত) চয়ন করতে তৈরি করেছিলাম যা এটি সাধারণত না করতে পারে। সম্ভবত এ এই ক্ষেত্রে যে তা deref বলপ্রয়োগ করার অনুমতি দিয়েছে। তবে এটি কেবল অনুমান।