gw-rust-programming-tutorial 0.1.0

gw rust test.
Documentation
use stdext::function_name;
use backtrace::Backtrace;
/// ```
/// let a ;
/// {
///    let x=5;
///    a = &x;
/// }
/// ```
pub fn test_lifetime_fn()
{
    println!("{}",function_name!());
    let string1 = String::from("abcd");
    let string2 = "xyz";

    let result = longest(string1.as_str(), string2);
    println!("The longest string is {}", result);



    test_struct_ref_member();

    let result = longest_with_an_announcement(string1.as_str(), string2,string2);
    println!("2The longest string is {}", result);


}

//生命周期标注有着一个不太常见的语法:生命周期参数名称必须以撇号(')开头,其名称通常全是小写,类似于泛型其名称非常短。'a 是大多数人默认使用的名称。生命周期参数标注位于引用的 & 之后,并有一个空格来将引用类型与生命周期标注分隔开。
// fn longest(x: & str, y: & str) -> & str {
//     if x.len() > y.len() {
//         x
//     } else {
//         y
//     }
// }
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

// fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
//     if x.len() > y.len() {
//         x
//     } else {
//         y
//     }
// }


struct ImportantExcerpt<'a> {
    part: &'a str,
}

fn test_struct_ref_member() {
    let bt = Backtrace::new();

    let novel = String::from("Call me Ishmael. Some years ago...");
    let first_sentence = novel.split('.')
        .next()
        .expect("Could not find a '.'");
    let i = ImportantExcerpt { part: first_sentence };

    println!("i={}",i.part);


    println!("{:?}", bt);
}

//泛型模板参数生命周期
use std::fmt::Display;

fn longest_with_an_announcement<'a, T>(x: &'a str, y: &'a str, ann: T) -> &'a str
    where T: Display
{
    println!("Announcement! {}", ann);
    if x.len() > y.len() {
        x
    } else {
        y
    }
}