关于rust中常见trait (一)

关于Drop: std::ops::Drop

/// 当一个类型实现Drop trait就不能实现Clone trait
/// 当一个类型是Copy,那就意味着按位复制就可以创建一个新的独立拷贝
/// ```rust
/// fn drop<T>(_x: T)  // 传参发生"转移(move)"
/// {
///   ...
/// }
/// ```
/// 以值传递的方式,从调用者那获取所有权,然后什么也不做;当_x离开作用域时rust就会drop它的值
///
#[test]
fn test_trait_drop_demo () {
    struct Application {
        name: String,
        data: Vec<String>,
    }

    impl Drop for Application {
        fn drop(&mut self) {
            println!("==Dropping {}", self.name);
            if !self.data.is_empty() {
                print!("==data({})", self.data.join(","));
            }
            println!("");
        }
    }

    let mut app1 = Application {
        name: String::from("zeus"),
        data: vec![String::from("hello"), String::from("world")],
    };

    drop(app1);  // 当在此处手动进行drop操作时,会使得app1变成"未被初始化状态"
    // drop(app1);  // 第二次主动drop是不被允许的,因为此时app1处于"未被初始化状态";
    println!("===start===");
    app1 = Application {  // 当调用drop时,此时的app1变成"初始化"而不是进行内容的修改
        name: String::from("lucas"),
        data: vec![String::from("h"), String::from("w")],
    }; // app1修改前的内容 会被drop
    println!("===end===");

    println!("===华丽分割线===");
    let app3 ; // 可以声明变量,并将初始化操作放置在后面
    {
        let app2 = Application {
            name: "app2".to_string(),
            data: vec!["hello".to_string(), "world".to_string()],
        };

        let flag = true;

        // 当flag == true时 app3 = app2时 app2"持有"的内容发生了move(转译),最终的drop的"时机"是在函数的结束
        // 当flag == flase时 不存在app2内容发生move(转译), 故而drop发生在当前代码块结束的位置
        if flag == true {
            app3 = app2;
        }
    }// inner-block-end
    // 当app3未被初始化时 不需要进行drop
    // drop(app3);
    println!("Sproing! What was that? ");

} // outer-block-end; 修改app1的内容被drop

关于Sized: std::marker::Sized

/// 在rust中所有固定大小的类型都是实现了 std::marker::Sized trait;
/// 切记:rust为所有合适的类型自动实现了Sized trait,不需要用户来实现并且也不能自己实现;
/// Sized主要的作用也是唯一的作用,用作类型参数的约束:
/// - T: Sized的约束要求T是一个大小在编译期已知的类型
/// 不过Rust也存在一些大小不固定的类型:它们的值大小并不相同;
/// 比如字符串切片类型str、dyn类型(trait对象引用的目标)、struct中最后一个字段(也只能是最后一个字段)
/// 在Rust中不能在变量中存储大小不固定的值或者将它们用作参数传递; 
///  一个指向大小不固定的值的指针总是一个胖指针,占用两个字节:比如指向切片的指针 + 切片长度就对应str胖指针
///           一个trait对象 + 一个指向trait方法实现的vtable指针 对应 trait object
/// 
#[test]
fn test_sized_demo() {
    // sized用来标识当前类型在编译期间大小固定
    // ?sized代表类型大小固定或不固定,在编译期大小不固定
    //  T: ?Sized: 可以提供大小固定的类型;也可以提供大小固定的类型
    struct RcBox<T: ?Sized> {
        ref_count: usize,
        value: T,
    }

    // T: ?Sized此时T为String,一个胖指针: buf指针 + 容量capacity + 长度length
    let boxed_lunch: RcBox<String> = RcBox {
        ref_count: 1,
        value: "hello_world".to_string(),
    };

    // RcBox<dyn Display>此时T是一个大小不固定的类型:实现Display trait的对象dyn Display
    // 直接使用RcBox<dyn Display>类型是不被允许的,在编译期当前类型大小是不确定的,需要使用&RcBox<dyn Display>
    // 这样就可以将一个引用&RcBox<String> 转换为胖指针引用 &RcBox<dyn Display>
    let boxed_displayable: &RcBox<dyn Display> = &boxed_lunch;
    // println!("{:?}", boxed_displayable);
    //
    fn display(boxed: &RcBox<dyn Display>) {
        println!("for your enjoyment: {}", &boxed.value);
    }

    // 当向函数传参时 隐式进行了类型转换
    display(&boxed_displayable);
}

引用

Drop
动态类型与固定类型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容