আমি মনে করি আরও কিছু স্পষ্ট করার মতো কিছু আছে। সংগ্রহের ধরণের, যেমন Vec<T>এবং এর VecDeque<T>এমন into_iterপদ্ধতি রয়েছে যা ফলিত করে Tকারণ তারা প্রয়োগ করে IntoIterator<Item=T>। আমাদের Foo<T>পুনরুক্তি করা হয় এমন ধরণের তৈরি করতে আমাদের থামানোর মতো কিছুই নেই , তবে এটি Tঅন্য কোনও প্রকারের নয় U। যে, Foo<T>প্রয়োগ IntoIterator<Item=U>।
বাস্তবে, কয়েকটি উদাহরণ রয়েছে std: &Path প্রয়োগ IntoIterator<Item=&OsStr> ও &UnixListener প্রয়োগ IntoIterator<Item=Result<UnixStream>> ।
into_iterএবং মধ্যে পার্থক্যiter
into_iterএবং এর মধ্যে পার্থক্য সম্পর্কে মূল প্রশ্নে ফিরে যান iter। অন্যরা যেমন নির্দেশ করেছে তার অনুরূপ, পার্থক্যটি into_iterহ'ল একটি প্রয়োজনীয় পদ্ধতি IntoIteratorযা নির্দিষ্ট কোনও ধরণের ফলন করতে পারে IntoIterator::Item। সাধারণত, যদি কোনও প্রকার প্রয়োগ করে IntoIterator<Item=I>, কনভেনশন অনুসারে এর দুটি অ্যাড-হক পদ্ধতিও রয়েছে: iterএবং iter_mutযা উত্পাদন করে &Iএবং &mut Iযথাক্রমে।
এর অর্থ যা বোঝায় তা হ'ল আমরা এমন একটি ফাংশন তৈরি করতে into_iterপারি যা একটি বৈশিষ্ট্যযুক্ত বাউন্ড ব্যবহার করে পদ্ধতি (যেমন এটি একটি পুনরাবৃত্তিযোগ্য) পায় এমন একটি প্রকার গ্রহণ করে:
fn process_iterable<I: IntoIterator>(iterable: I) {
for item in iterable {
// ...
}
}
যাইহোক, আমরা *iter পদ্ধতি বা iter_mutপদ্ধতি থাকতে কোনও ধরণের প্রয়োজনের জন্য আবদ্ধ বৈশিষ্ট্যটি ব্যবহার করতে পারি না , কারণ তারা কেবল কনভেনশন। আমরা বলতে পারি into_iterআরও ব্যাপক ভাবে চেয়ে ব্যবহারযোগ্য হয় iterবা iter_mut।
বিকল্প iterএবংiter_mut
আরেকটি আকর্ষণীয় পালন করা হয় iterকোনো ইটারেটরে উৎপাদনের যে পেতে একমাত্র উপায় নয় &T। কনভেনশন দ্বারা (আবার), সংগ্রহ ধরনের SomeCollection<T>মধ্যে stdযা আছে iterপদ্ধতি তাদের অপরিবর্তনীয় রেফারেন্স ধরনের &SomeCollection<T>বাস্তবায়ন IntoIterator<Item=&T>। উদাহরণস্বরূপ, &Vec<T> প্রয়োগগুলি IntoIterator<Item=&T> , সুতরাং এটি আমাদের পুনরাবৃত্তি করতে সক্ষম করে &Vec<T>:
let v = vec![1, 2];
// Below is equivalent to: `for item in v.iter() {`
for item in &v {
println!("{}", item);
}
যদি উভয়ই বাস্তবায়নের v.iter()সমতুল্য হয় তবে কেন মরিচা উভয় সরবরাহ করে? এটি এর্গোনমিক্সের জন্য। ইন লুপ, এটা ব্যবহার করা একটি বিট আরো সংক্ষিপ্ত এর চেয়ে ; কিন্তু অন্যান্য ক্ষেত্রে, তুলনায় অনেক পরিষ্কার হয় :&vIntoIterator<Item=&T>for&vv.iter()v.iter()(&v).into_iter()
let v = vec![1, 2];
let a: Vec<i32> = v.iter().map(|x| x * x).collect();
// Although above and below are equivalent, above is a lot clearer than below.
let b: Vec<i32> = (&v).into_iter().map(|x| x * x).collect();
একইভাবে, forলুপগুলিতে, এর v.iter_mut()সাথে প্রতিস্থাপন করা যেতে পারে &mut v:
let mut v = vec![1, 2];
// Below is equivalent to: `for item in v.iter_mut() {`
for item in &mut v {
*item *= 2;
}
কখন কোনও প্রকারের জন্য (প্রয়োগ করা) into_iterএবং iterপদ্ধতিগুলি সরবরাহ করতে হবে
যদি টাইপটির পুনরাবৃত্তি হওয়ার জন্য কেবল একটি "উপায়" থাকে তবে আমাদের উভয়টি প্রয়োগ করা উচিত। যাইহোক, যদি দুটি উপায় বা তার বেশি থাকে তবে এটি পুনরাবৃত্তি হতে পারে, পরিবর্তে আমাদের প্রতিটি উপায়ে একটি অ্যাড-হক পদ্ধতি সরবরাহ করা উচিত।
উদাহরণস্বরূপ, Stringসরবরাহ করে না into_iterবা iterকারণ এটির পুনরাবৃত্তি করার দুটি উপায় রয়েছে: বাইটগুলিতে এর উপস্থাপনা পুনরাবৃত্তি করা বা অক্ষরগুলিতে এর প্রতিনিধিত্ব পুনরাবৃত্তি করা। পরিবর্তে, এটি দুটি পদ্ধতি সরবরাহ করে: bytesবাইটগুলি charsপুনরাবৃত্তি করার জন্য এবং অক্ষরের পুনরাবৃত্তির জন্য, iterপদ্ধতির বিকল্প হিসাবে ।
* ঠিক আছে, প্রযুক্তিগতভাবে আমরা একটি বৈশিষ্ট্য তৈরি করে এটি করতে পারি। তবে তারপরে আমরা implপ্রতিটি ধরণের ব্যবহার করতে চাই তার জন্য আমাদের সেই বৈশিষ্ট্যটি প্রয়োজন । ইতিমধ্যে, stdইতিমধ্যে প্রয়োগ অনেক ধরণের IntoIterator।