gw_rust_programming_tutorial/chapter_10/
test_lifetime.rs

1use stdext::function_name;
2use backtrace::Backtrace;
3/// ```
4/// let a ;
5/// {
6///    let x=5;
7///    a = &x;
8/// }
9/// ```
10pub fn test_lifetime_fn()
11{
12    println!("{}",function_name!());
13    let string1 = String::from("abcd");
14    let string2 = "xyz";
15
16    let result = longest(string1.as_str(), string2);
17    println!("The longest string is {}", result);
18
19
20
21    test_struct_ref_member();
22
23    let result = longest_with_an_announcement(string1.as_str(), string2,string2);
24    println!("2The longest string is {}", result);
25
26
27}
28
29//生命周期标注有着一个不太常见的语法:生命周期参数名称必须以撇号(')开头,其名称通常全是小写,类似于泛型其名称非常短。'a 是大多数人默认使用的名称。生命周期参数标注位于引用的 & 之后,并有一个空格来将引用类型与生命周期标注分隔开。
30// fn longest(x: & str, y: & str) -> & str {
31//     if x.len() > y.len() {
32//         x
33//     } else {
34//         y
35//     }
36// }
37fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
38    if x.len() > y.len() {
39        x
40    } else {
41        y
42    }
43}
44
45// fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
46//     if x.len() > y.len() {
47//         x
48//     } else {
49//         y
50//     }
51// }
52
53
54struct ImportantExcerpt<'a> {
55    part: &'a str,
56}
57
58fn test_struct_ref_member() {
59    let bt = Backtrace::new();
60
61    let novel = String::from("Call me Ishmael. Some years ago...");
62    let first_sentence = novel.split('.')
63        .next()
64        .expect("Could not find a '.'");
65    let i = ImportantExcerpt { part: first_sentence };
66
67    println!("i={}",i.part);
68
69
70    println!("{:?}", bt);
71}
72
73//泛型模板参数生命周期
74use std::fmt::Display;
75
76fn longest_with_an_announcement<'a, T>(x: &'a str, y: &'a str, ann: T) -> &'a str
77    where T: Display
78{
79    println!("Announcement! {}", ann);
80    if x.len() > y.len() {
81        x
82    } else {
83        y
84    }
85}