• Rust <4>:所有权、借用、切片


    tips:栈内存分配大小固定,访问时不需要额外的寻址动作,故其速度快于堆内存分配与访问。

    rust 所有权规则:

    • 每一个值在任意时刻都有且只有唯一一个所有者
    • 当所有者离开作用域时,这个值将被丢弃

    所有权变更示例:

    fn main() {
        let mut zs0 = String::from("Hello ");
        zs0.push_str("World!");
    
        //let zs1 = zs0;
        //print(zs0);
    
        println!("zs0: {:?}", zs0);
    
        let zs2 = &zs0;
        println!("zs0: {:?}, zs2: {:?}", zs0, zs2);
    }
    
    fn print(zparam: String) -> (i32, bool) {    // 若参数改为:zparam: &String 则不会导致所有权 move
        println!("{}", zparam);
        return (8, false);
    }
    • 以上示例中注释掉的两句,启用任何一句,都将导致无法通过编译,任何非引用斌值,包括函数斌参,都会导致所有权变更(move)
    • rust 中的引用概念,与读写锁的性质类似,任意时刻若存在一个可变引用,则不能存在其它的可变或不可变引用,若不存在可变引用,则可存在任意数量的不可变引用

    切片是对数组的引用,类似 golang/python 的切片,示例如下:

     fn main() {
        let zvar0 = [0, 1, 2, 3, 4, 5, 6, 7];
        let zvar1 = "Hello World!";
        let zvar2 = String::from("@@@@");
    
        println!("{:?}", &zvar0[..]);
        print(&zvar1[..4]);
        print(&zvar2[..4]);
    }
    
    fn print(slice: &str) -> i32 {
        println!("{:?}", slice);
        0
    }

    ____

  • 相关阅读:
    POI Excel表格合并,边框设置
    MYSQL中group_concat有长度限制!默认1024(转载)
    MARQUEE 字符滚动条效果
    <A>标签电子邮件链接
    <A>标签锚标记
    <hr> 水平样式分隔线
    sudo gem install cocoapods 没反应问题
    适配iPhone6和iPhone6 Plus
    同步推是如何给未越狱的IOS设备安装任意IPA的?
    据说是百度ios面试题
  • 原文地址:https://www.cnblogs.com/hadex/p/7764156.html
Copyright © 2020-2023  润新知