यह जब तक .step_by
विधि स्थिर किया जाता है, एक आसानी से पूरा कर सकते हैं कि आप एक Iterator
साथ क्या चाहते हैं (जो क्या Range
रों वास्तव में वैसे भी कर रहे हैं) मुझे लगता है:
struct SimpleStepRange(isize, isize, isize); // start, end, and step
impl Iterator for SimpleStepRange {
type Item = isize;
#[inline]
fn next(&mut self) -> Option<isize> {
if self.0 < self.1 {
let v = self.0;
self.0 = v + self.2;
Some(v)
} else {
None
}
}
}
fn main() {
for i in SimpleStepRange(0, 10, 2) {
println!("{}", i);
}
}
एक पुनरावृति करने की आवश्यकता है विभिन्न प्रकार के एक से अधिक श्रेणियों, कोड सामान्य बनाया जा सकता है इस प्रकार है:
use std::ops::Add;
struct StepRange<T>(T, T, T)
where for<'a> &'a T: Add<&'a T, Output = T>,
T: PartialOrd,
T: Clone;
impl<T> Iterator for StepRange<T>
where for<'a> &'a T: Add<&'a T, Output = T>,
T: PartialOrd,
T: Clone
{
type Item = T;
#[inline]
fn next(&mut self) -> Option<T> {
if self.0 < self.1 {
let v = self.0.clone();
self.0 = &v + &self.2;
Some(v)
} else {
None
}
}
}
fn main() {
for i in StepRange(0u64, 10u64, 2u64) {
println!("{}", i);
}
}
मैं ऊपरी सीमा एक खुला समाप्त संरचना बनाने के लिए जाँच करता है, तो अनंत लूप के लिए आवश्यक है खत्म करने के लिए आप के लिए छोड़ देंगे ...
इस दृष्टिकोण के लाभ यह है कि for
शर्करा के साथ काम करता है और अस्थिर सुविधाओं को प्रयोग करने योग्य होने पर भी काम करना जारी रखेगा; मानक Range
एस का उपयोग कर डी-शक्कर दृष्टिकोण के विपरीत, यह कई .next()
कॉल द्वारा दक्षता खोना नहीं है। नुकसान यह है कि यह इटरेटर सेट अप करने के लिए कोड की कुछ पंक्तियां लेता है, इसलिए केवल उस कोड के लिए लायक हो सकता है जिसमें बहुत सारे लूप हैं।
cf. num टोकरा का उपयोग करें https://doc.rust-lang.org/core/ops/struct.Range.html#method.step_by और https://github.com/rust-lang/rust/issues/27741 – maxschlepzig