rust学习笔记基础篇4--结构体变量声明与绑定,所有权,借用,引用(霜之小刀)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lihn1987/article/details/79951077

rust学习笔记基础篇4–结构体变量声明与绑定,所有权,借用,引用(霜之小刀)

欢迎转载和引用,若有问题请联系
若有疑问,请联系
Email : [email protected]
QQ:2279557541


关于结构体的变量声明

看过前面几节的就发现结构体的声明其实和其他的也没什么区别。

struct Xxx{
    a:i32,
    b:i16,
    c:bool,
}
let mut x = Xxx{a:1,b:2,c:false};
println!("a:{},b:{},c:{}", x.a, x.b, x.c);

这样就可以声明一个结构体并使用了。
2.2.4 绑定,所有权,借用,引用
虽然貌似能够声明rust的各种类型了,但是在测试的时候总是碰到一些奇怪的问题。
比如用旧的结构体初始化新的结构体后,旧的就没法用了?比如如下代码

struct Xxx{
    a:i32,
    b:i16,
    c:bool,
}
let mut x = Xxx{a:1,b:2,c:false};
let y = x;
println!("{}",x.a);

这段代码在println上报错,说是x被move了,没办法使用。
这里就不得不牵扯出rust语言的几个概念,绑定,所有权,借用,引用。

fn main() {
    struct Xxx{
        a:i32,
        b:i16,
        c:bool,
    }

    //这是绑定的意思,将100这个值创建出来,然后将x1这个名称绑定到这个值上
    let x1:i32 = 100;
    //这也是绑定的意思,将Xxx这个结构体创建出来,然后将x2的名称绑定到这个x2上。
    let x2 = Xxx{a:14, b:15, c:false};


    //这里将从x1拷贝一份新的,然后将y1绑定到这份新的上
    let mut y1:i32 = x1;
    //将x2所对应结构体的所有权转让给y2,之后x2就不能再使用了
    let mut y2 = x2;

    //用&表示借用,意思是借用下这个内容,可以读取,但是不能修改。
    //let z1 = &y1;
    //let z2 = &y2;

    //&mut 表示引用,引用就可以修改所引用的值得内容了,但是指导引用者被析构才会归还所有权,引用过程中被引用这不具有所有权。
    let a1 = &mut y1;
    let a2 = &mut y2;
}

这里感觉上有个歧义,在使用let a = b的时候,为何有时是将b拷贝一份,然后拷贝后变量所有权给a,而有的时候是直接把b变量的所有权转移给a呢?
这里其实就有个概念了,就是Traits这个概念了。这里先不说这个概念。
我们这样理解,所有系统默认有的变量类型,就是前面提到过的
有符号整数: i8, i16, i32, i64 和isize (指针大小)
无符号整数: u8, u16, u32, u64 和 usize (指针大小)
浮点: f32, f64
char Unicode标值一样 ‘a’, ‘α’ 和 ‘∞’ (每4字节)
bool 以及 true 或 false
这些类型,在=的过程中,都使用的是拷贝(其实是语言内部实现了copy),而其他的自定义的类型,如struct在未实现copy前,都是转移所有权的意思。而数组和元组,是根据其变量的类型决定到底是copy还是转移所有权。

猜你喜欢

转载自blog.csdn.net/lihn1987/article/details/79951077