2017-12-04 37 views
7

इस कोड को संकलित करता है और काम है, लेकिन मेरी समझ के अनुसार, यह संकलन नहीं करना चाहिए:यह जीवनकाल बाध्य क्यों नहीं करता है?

use std::fmt::Display; 

pub fn test<S>(s: S) 
where 
    S: Display + 'static, 
{ 
    println!("test: {}", s); 
} 

fn main() { 
    let s = String::from("string"); 

    test(s); 
} 

चर s के जीवनकाल main में है, लेकिन समारोह test एक बाध्य है कि S'static होना चाहिए। मुझे लगता है कि परिवर्तनीय s का जीवन 'static होना चाहिए या 'static से बड़ा होना चाहिए। मेरे तर्क के साथ क्या गलत है?

उत्तर

11

बाध्य S: 'a का अर्थ है कि S में निहित किसी भी संदर्भ को कम से कम 'a पर रहना चाहिए। S: 'static के लिए, इसका मतलब है कि एस में संदर्भों में 'static जीवनकाल होना चाहिए। String प्रकार में कोई संदर्भ नहीं है (यह इसके डेटा का मालिक है), और इसलिए कोड संकलित करता है।

the book का हवाला देते हुए: किसी भी संदर्भ के बिना

प्रकार T: 'static के रूप में गिनती। क्योंकि 'static का अर्थ है कि संदर्भ को पूरे कार्यक्रम के रूप में तब तक जीना चाहिए, एक प्रकार जिसमें कोई संदर्भ नहीं है, पूरे कार्यक्रम के रूप में लंबे समय तक रहने वाले सभी संदर्भों के मानदंडों को पूरा करता है (क्योंकि कोई संदर्भ नहीं है)।

आप test(&s) बजाय साथ समारोह, compilation will fail कॉल करते हैं:

error[E0597]: `s` does not live long enough 
    --> src/main.rs:14:11 
    | 
14 |  test(&s); 
    |   ^does not live long enough 
15 | } 
    | - borrowed value only lives until here 
    | 
    = note: borrowed value must be valid for the static lifetime... 

यहाँ, S कुछ जीवन 'a के लिए &'a String है, और जीवन भर के लिए बाध्य की आवश्यकता है कि 'a'static होना चाहिए, जो नहीं है मामला।

संबंधित मुद्दे