定义 strcut、定义结构体实例
struct User{
usrname:String,
email:String,
sign_in_count:u64,
active:bool,
}
fn main(){
let usr = User{
email:String::form("abc@163.com"),
usrname:String::from("nikey"),
active:true,
sign_in_count:556,
};
usr.email = String::from("bcd@163.com");
}
- 一旦 struct 的实例是可变的,那么实例中的所有字段都是可变的
更新修改结构体语法
//构造简写
fn _ch9(usrname: String, email: String) -> User {
User {
usrname,
email,
active: false,
sign_in_count: 23,
} //最后一行当返回值
}
//struct 更新语法
fn _ch10() -> User {
let usr1 = User {
email: String::from("abc@163.com"),
usrname: String::from("nikey"),
active: true,
sign_in_count: 556,
};
return User {
email: String::from("abc@163.com"),
..usr1//简写更新 其他属性可以直接进行 copy
};
}
let domain = String::from("www.runoob.com");
let name = String::from("RUNOOB");
let runoob = Site {
domain, // 等同于 domain : domain, 省略的写法
name, // 等同于 name : name, 省略的写法
nation: String::from("China"),
traffic: 2013
};
可变实例修改
let mut p = Point { x: 10, y: 20 };
p.x = 30;
p.y = 40;
Tuple struct 元组结构体
使用是一个元组定义为一个结构体
struct Color(i32,i32,i32);
struct Point(i32,i32,i32);
let black = Color(0,0,0);
let origin = Point(0,0,0);
struct 数据的所有权
struct User{
usrname:String,
email:String,
sign_in_count:u64,
active:bool,
}
这里字段使用了String 而不是 &str:
-
struct 实例拥有其所有的数据所有权
-
只要 struct 实例有效,那么里面的字段数据也是有效的
Option 枚举类
Option 是 Rust 标准库中的枚举类,这个类用于填补 Rust 不支持 null 引用的空白。
enum Option<T> {
Some(T),
None,
}
应用 Option 的场景
fn main() {
let opt = Option::Some("Hello");
match opt {
Option::Some(something) => {
println!("{}", something);
},
Option::None => {
println!("opt is nothing");
}
}
}
if let 语法
例子 1
let i = 0;
match i {
0 => println!("zero"),
_ => {},
}
改造后
let i = 0;
if i == 0 {
println!("zero");
}
例子 2
fn main() {
enum Book {
Papery(u32),
Electronic(String)
}
let book = Book::Electronic(String::from("url"));
match book {
Book::Papery(64) => println!("Papery {}", index),
_ => println!("Not papery book"),
}
}
改造后
fn main() {
enum Book {
Papery(u32),
Electronic(String)
}
let book = Book::Electronic(String::from("url"));
if let Book::Papery(index) = book {
println!("Papery {}", index);
} else {
println!("Not papery book");
}
}