3.rust语法进阶

一、结构体

上一章介绍了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,
}

随后就是一对大括号,而大括号中的内容就是我们这个结构体的各种属性。

比如这里我们想要保存一个学生的信息,就有姓名、年龄、性别等等,也就是这里的nameagesex

由于这种声明类型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;

虽然此时它内部没有任何属性、看起来没什么用处。

但当你学习了本章后面的“方法”后,就会发现它在某些时候还是有点用处的。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux