rust 语言所有权

本篇内容为方便自己理解而写,如有所言错误之处,恳请指正,谢谢

在讲rust语言所有权的前边,我们要先讲在堆上和栈上的数据类型,通常来说数据类型大小在编译期就已经固定的存放在栈上,数据类型大小不固定的存放在堆上。比如整型,浮点数,布尔值存放在栈上。字符串类型存放在堆上。

字符串类型之所以在堆上,因为字符串类型在编译器不一定是固定的,如下方程序看到的字符串s编译期的大小不固定

字符串数据类型的展示

fn main() {
    let mut s: String = String::from("hello");
    s.push_str(" world");
    println!("{s}");
}

在下面这段代码里s1和s2指向同一块内存地址,相当于浅拷贝,而字符串在离开作用域时会释放再存空间,所以这样s1和s2会出现释放同一块内存地址出现报错,因为这时s1的所有权已经交给s2,正确做法是将s1进行深拷贝,开辟一块新的内存空间

fn main() {

    // let s1: String = String::from("hello");
    // println!("{s1}");
    //
    // let s2 = s1;
    // println!("{s1},{s2}");

    // 正确
    let s1: String = String::from("hello");
    println!("{s1}");

    let s2 = s1.clone();
    println!("{s1},{s2}");
}

字符串类型在离开作用域后字符串会类似触发一个析构的函数释放,所以当一个字符串进入到函数里,而这个函数并没有对应的返回值,则在这个函数中完成该·字符串内存空间的释放

在如下代码中,函数里传进去字符串s,这时函数里的s由于离开作用域会被释放,所以外边的s无法打印到,会出现所有权已经借出的提示,如果想要使用的话需要传回返回值

fn main() {
    let mut s: String = String::from("hello");
    println!("{s}");
    push_world(s);

    println!("{s}");

}

fn push_world(mut s: String){
    s.push_str("world");
    println!("{s}");
}

fn main() {
    let mut s: String = String::from("hello");
    let s1 = back(s);
    println!("{s1}");
}

fn back(mut s: String) -> String{
    s.push_str("world");
    return s;
}

实现copy trait 的可以在发生拷贝时,被拷贝的变量还能使用,默认实现copy trait的是整型,浮点,字符,布尔值,元组

fn main() {
    let a: i64 = 24;
    let b: i64 = a;
    println!("{a} {b}");

    let c: char = 'e';
    let d: char = c;
    println!("{c} {d}");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值