and then sum()
knows to return an i32
यह वह जगह है जहां आप गलत हो गए थे। Iterator::sum
की जाँच करें:
fn sum<S>(self) -> S
where S: Sum<Self::Item>
यह एक सामान्य प्रकार S
Sum
लागू करने के लिए है जो देता है। S
Self::Item
से मेल खाना है। इसलिए, कंपाइलर को आपको यह निर्दिष्ट करने की आवश्यकता है कि टाइप करने के लिए टाइप करें।
यह उपयोगी क्यों है? मानक पुस्तकालय से इन दो नमूना कार्यान्वयन देखें:
impl Sum<i8> for i8
impl<'a> Sum<&'a i8> for i8
यह सही है! आप u8
या&u8
के इटरेटर का एक पुनरावर्तक जोड़ सकते हैं! हम इस नहीं था, तो यह कोड काम नहीं होगा:
fn main() {
let a: i32 = (0..5).sum();
let b: i32 = [0, 1, 2, 3, 4].iter().sum();
assert_eq!(a, b);
}
As bluss points out, हम एक जुड़े प्रकार जो टाई होगा u8 -> u8
और &'a u8 -> u8
होने से यह पूरा कर सकता है।
यदि हमारे पास केवल एक संबद्ध प्रकार था, तो लक्ष्य योग प्रकार हमेशा तय किया जाएगा, और हम लचीलापन खो देंगे। उदाहरण के लिए, हम अपने स्वयं के प्रकारों के लिए Sum
भी कार्यान्वित कर सकते हैं।
यहां, हम u8
एस को जोड़ते हैं, लेकिन हमारे द्वारा एकत्र किए जाने वाले प्रकार के आकार को बढ़ाते हैं, क्योंकि यह संभावना है कि यह योग u8
से अधिक हो जाएगा। इस कार्यान्वयन अतिरिक्त है मानक पुस्तकालय से मौजूदा कार्यान्वयन करने के लिए:
#[derive(Debug, Copy, Clone)]
struct Points(i32);
impl std::iter::Sum<u8> for Points {
fn sum<I>(iter: I) -> Points
where I: Iterator<Item = u8>
{
let mut pts = Points(0);
for v in iter {
pts.0 += v as i32;
}
pts
}
}
fn main() {
let total: Points = (0u8..42u8).sum();
println!("{:?}", total);
}
संबंधित प्रश्न: http: // stackoverflow।कॉम/क्यू/40243061/1233251 –