一、结构体
上一章介绍了Rust中的一些基本语法,本章继续深入学习Rust中的一些高级特性。
首先要介绍的就是结构体,它的作用与上一章介绍的元组类似,可以用来存放一系列有关联、不同类型的数据。
如果你了解C/C++,那基本与C/C++
中的结构体一致,或者与python
中的字典类似。
使用方法如下:
struct Student{
name:String,
age:u32,
sex:char,
}
fn main() {
let s=Student{
name:String::from("yushi-"),
age:100,
sex:'男'
};
println!("{} {} {}", s.name, s.age,s.sex);
}
首先是声明一个结构体,需要用struct
关键字,后面紧跟结构体的名称,这里我给它取名为Student
,因为要用它来保存学生的信息。
struct Student{
name:String,
age:u32,
sex:char,
}
随后就是一对大括号,而大括号中的内容就是我们这个结构体的各种属性。
比如这里我们想要保存一个学生的信息,就有姓名、年龄、性别等等,也就是这里的name
、age
、sex
。
由于这种声明类型rust
的编译器无法为我们自动推断各个属性的类型,所以需要在其后面手动添加类型注解。
比如上面的:String
、:u32
以及:char
,分别代表字符串类型、无符号整数类型、以及字符类型。
而各个属性之间用,
分隔,一般我们习惯于将各个属性分行写,更好看。
这里出现了一个字符串类型String
,前面没有提到过。
之所以没有提到,一是因为它并不是rust中的基本类型,二是因为Rust
中的字符串类型非常复杂与强大,需要后面专门花一章对它介绍才能将其讲清楚,所以这里就暂时先用着,只需要知道它是保存字符串的就行了。
比如"hello world"
这种,用双引号包裹起来的就是字符串,但在Rust
中又有一点不一样,我们后面再讨论。
声明好了这个结构体后,我们就可以像普通的类型那样,用它来定义一个变量:
let s=Student{
name:String::from("yushi-"),
age:100,
sex:'男'
};
与声明这个结构体时的写法类似,只是去除了前面的struct
关键字,然后把大括号中的各个属性值后面的类型注解,更换为你要给它们赋的值就好了!
注意,各个内部属性的赋值顺序是可以任意调换的,比如可以先给age字段赋值,然后再给nama字段赋值,但必须全部赋值。
执行完上面的代码后,s
变量就是一个我们自己的Student
类型的变量了。
注意String
类型中name
属性的赋值方式,需要调用String
里面的from
方法将一个字符串转换为String
。
这就是Rust
中比较独特的方式,虽然看起来比较繁琐,但到后面你明白了它的原理,应该就能理解它这样做的理由了。
如果要访问这个变量中的各个字段,也非常的简单,只需要用.
即可。
println!("{} {} {}", s.name, s.age,s.sex);
比如这里我就用.
的方式访问它内部的三个字段,并进行了输出。
当然了,它默认同样是不可修改的,如果你想要对它进行修改,请使用let mut
。
上面内容是结构体中最常见的用法,但事实上结构体还有其它形式,在一些开源代码中可能会经常看到。
比如你完全可以声明一个空的结构体:
struct S;
虽然此时它内部没有任何属性、看起来没什么用处。
但当你学习了本章后面的“方法”后,就会发现它在某些时候还是有点用处的。