zoukankan      html  css  js  c++  java
  • 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
    }

    ____

  • 相关阅读:
    一次线上bug引起的反思
    本地调试接口返回信息不对 以及 jar冲突问题
    404问题记录
    Intelij IDEA 配置Tomcat时找不到 “Application Server”
    java多线程处理问题
    DataTemplate和ControlTemplate的关系
    WP模板
    wp中的动画
    wp中的位图
    2013.7.22-7.28开发资料汇总
  • 原文地址:https://www.cnblogs.com/hadex/p/7764156.html
Copyright © 2011-2022 走看看