结构体
带名字的结构体
struct s{
a: i32,
b:i32
}
不带参数名字的结构体(元组结构体)
struct Color(i32, i32, i32);
不带括号的结构体
struct Test;
使用impl为结构体定义方法
impl Test{
fn method1(&self:&Self){
println!("hello");
}
fn method2(a:i32){
println!("{a}");
}
}
let test:Test = Test;
test.method1();//方法调用 (定义时加self)是一个语法糖相当于 Test::method1(&test);
Test::method2(6);//内联函数调用(定义时不用加self)
枚举
enum Color{
Red,
Blue,
Green
}
特殊的
enum Option<T>{
None,
Some(T)
}
使用match 匹配
enum Country{
China,
Us
}
enum Money{
one,
five,
ten,
hundred(Country)
}
使用match匹配默认要处理所有情况,注意:使用的是=>而不是->
使用if let 匹配只要处理一种情况
项目结构
- binary crate
- library crate
一个项目最多有一个lib.rs和多个binary crates
在lib.rs里定义mod
mod定义模块
可以使用相对路径访问mod 使用super self符号
定义的enum如果使用pub修饰,那里面的值默认也是pub
定义的struct如果使用pub修饰,里面的值默认是private
错误处理
有一个
enum Result<T,E>{
Ok(T),
Err(E),
}
如果对一个Option或者Result类型调用.unwrap()方法,当值为None or Err时就会panic
let file = File::open("").unwrap();
如果要在panic时显示自定义信息,那就使用.expect("error msg"),主义这是expect而不是except,表示panic时期望的输出
let file = File::open("").expect("open failed");
如果不让程序panic,要进行错误处理
fn open_file(path:&str) -> result:Result<(),std::io:Error>
let file = match File::open(path){
Ok(f) => f,
Err() => {
println!("open faild,please check you path")
}
}
Ok(())
}
有一种简便的方式等价于这种错误处理
fn open_file(path:&str) -> result:Result<(),std::io:Error>
let file = File::open(path)?
Ok(())
}
生命周期
省略规则
- 编译器为每个输入类型中的每个生命周期分配不同的生命周期参数
- 如果只有一个输入生命周期参数,该生命周期将被分配给所有的生命周期参数
- 如果有多个输入生命周期参数,但其中一个是&self 或 &mut self,那么self的生命周期会被分配给所有的输出生命周期参数
fn test(x:&str) ->&str{}//参数中只有一个应用,默认使用它的生命周期
impl<'a> ImportantExcerpt<'a> {
fn level(&self) -> i32 {//有&self 输出参数没有引用,不需要生命周期
3
}
}
impl<'a> ImportantExcerpt<'a> {
fn announce_and_return_part(&self, announcement: &str) -> &str {
//有&self ,&str默认生命周期为&self的生命周期
println!("Attention please: {announcement}");
self.part
}
}