【百例RUST - 007】结构体
【百例RUST - 007】结构体第一章 结构体基础用法第01节 定义结构体格式struct 结构体名称 { 字段名称1 : 字段类型, 字段名称2 : 字段类型, 字段名称3 : 字段类型, }案例structUser{name:String,count:String,nonce:u64,active:bool,}第02节 构建实例构建不可变的实例只读格式struct 实例名称 结构体名称 { 字段名称1 : 字段值1, 字段名称2 : 字段值2, 字段名称3 : 字段值3, }代码// 创建结构体实例letxiaomingUser{name:String::from(xiaoming),count:String::from(80001000),nonce:10000,active:true,};构建可变的实例可修改格式struct mut 实例名称 结构体名称 { 字段名称1 : 字段值1, 字段名称2 : 字段值2, 字段名称3 : 字段值3, }代码// 创建结构体实例letmutxiaohuangUser{name:String::from(xiaoming),count:String::from(80001000),nonce:10000,active:true,};第03节 获取值案例代码1fnmain(){// 定义结构体structUser{name:String,count:String,nonce:u64,active:bool,}// 构建实例letxiaomingUser{name:String::from(xiaoming),count:String::from(80001000),nonce:10000,active:true,};// 获取值println!(name {},xiaoming.name);// name xiaoming}案例代码2fnmain(){// 定义结构体structUser{name:String,count:String,nonce:u64,active:bool,}// 构建实例letxiaomingUser{name:String::from(xiaoming),count:String::from(80001000),nonce:10000,active:true,};// 获取值, 存储到变量中letvalue_countxiaoming.count;println!(value_count {},value_count);// value_count 80001000// println!(count {}, xiaoming.count); // 注意上面出现了所有权的 MOVE 不能使用了}第04节 修改值案例代码1fnmain(){// 定义结构体structUser{name:String,count:String,nonce:u64,active:bool,}// 构建实例 不可变的结构体letxiaomingUser{name:String::from(xiaoming),count:String::from(80001000),nonce:10000,active:true,};// 修改变量xiaoming.countString::from(301000);// 这里直接修改值, 会报错因为当前是不可变的结构体println!(xiaoming.count {},xiaoming.count);}案例代码2fnmain(){// 定义结构体structUser{name:String,count:String,nonce:u64,active:bool,}// 构建实例 可变的结构体letmutxiaomingUser{name:String::from(xiaoming),count:String::from(80001000),nonce:10000,active:true,};// 修改变量xiaoming.countString::from(301000);println!(xiaoming.count {},xiaoming.count);// xiaoming.count 301000}第二章 其他方式构建结构体第01节 参数名称和字段名同名fnmain(){// 定义结构体structUser{name:String,count:String,nonce:u64,active:bool,}letnameString::from(xiaohong);letcountString::from(80001000);letnonce10000;letactivetrue;// 构建实例, 这里可以简化书写letxiaohongUser{name,count,nonce,active};// 输出println!(name {},xiaohong.name);// name xiaohong}第02节 从其他结构体创建实例案例代码1所有属性完全照抄fnmain(){// 定义结构体structUser{name:String,count:String,nonce:u64,active:bool,}letxiaomingUser{name:String::from(xiaoming),count:String::from(80010010),nonce:1000,active:true,};// 构建实例letxiaohongUser{..xiaoming};// 输出println!(count {},xiaohong.count);// count 80010010}案例代码2部分属性自己定义其他属性照抄fnmain(){// 定义结构体structUser{name:String,count:String,nonce:u64,active:bool,}letxiaomingUser{name:String::from(xiaoming),count:String::from(80010010),nonce:1000,active:true,};// 构建实例letxiaohongUser{name:String::from(xiaohong),..xiaoming};// 输出println!(name {},xiaohong.name);// name xiaohong}第03节 元组结构体fnmain(){// 定义结构体structPoint(i32,i32);// 创建结构体实例letaPoint(10,20);letbPoint(30,50);// 输出println!(a.x {} b.y{},a.0,b.1);// a.x 10 b.y50}第04节 没有任何字段的类单元结构体fnmain(){// 定义结构体structA{};}第三章 打印结构体第01节 打印在一行fnmain(){// 创建结构体类型#[derive(Debug)]// 这里需要加上宏structUser{name:String,count:String,nonce:u64,active:bool,}// 创建结构体实例letxiaomingUser{name:String::from(xiaoming),count:String::from(80001000),nonce:10000,active:true,};// 打印结构体, 打印在一行的写法println!(xiaoming {:?},xiaoming);}// xiaoming User { name: xiaoming, count: 80001000, nonce: 10000, active: true }第02节 打印在多行fnmain(){// 创建结构体类型#[derive(Debug)]// 这里需要加上宏structUser{name:String,count:String,nonce:u64,active:bool,}// 创建结构体实例letxiaomingUser{name:String::from(xiaoming),count:String::from(80001000),nonce:10000,active:true,};// 打印结构体, 打印在多行的写法println!(xiaoming {:#?},xiaoming);}// xiaoming User {// name: xiaoming,// count: 80001000,// nonce: 10000,// active: true,// }第四章 结构体的函数第01节 定义函数格式说明impl 结构体名称{ fn 函数名称(self, 变量名称: 数据类型) - 返回值类型 { .......函数体......... 返回值 } }self类似于在 Java 当中的this关键字案例代码// 创建结构体类型#[derive(Debug)]structUser{name:String,age:i32,sex:char,}// 编写方法implUser{fnget_name(self)-str{(self.name[..])}fnget_age(self)-i32{self.age}fnget_sex(self)-char{self.sex}fnstudy(self){println!(study rust);}}第02节 使用函数格式说明1、无返回值的调用: 结构体的对象.函数名称(参数); 2、有返回值的调用: let 返回值 结构体的对象.函数名称(参数);案例代码// 创建结构体类型#[derive(Debug)]structUser{name:String,age:i32,sex:char,}// 编写方法implUser{fnget_name(self)-str{(self.name[..])}fnget_age(self)-i32{self.age}fnget_sex(self)-char{self.sex}fnstudy(self){println!(study rust);}}fnmain(){// 构建对象letuserUser{name:String::from(xiaoming),age:31,sex:男,};println!(user {:#?},user);println!(name {},user.get_name());println!(age {},user.get_age());println!(sex {},user.get_sex());user.study();}// user User {// name: xiaoming,// age: 31,// sex: 男,// }// name xiaoming// age 31// sex 男// study rust