欢迎转载和引用,若有问题请联系
若有疑问,请联系
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还是转移所有权。