2023学习日志

2023-07-06 16:12:45 浏览数 (1)

rust

panic!宏与不可恢复错误

可以显式在代码中调用panic!宏,程序在执行到该语句时将报错并退出程序,而通过设置RUST_BACKTRACE环境变量,可以在panic!报错时输出当时的程序调用栈,便于debug

Result与可恢复错误

Result是一个枚举类型,其定义如下:

代码语言:rust复制
enum Result <T,E>{
    Ok(T),
    Err(E),
}

其中T、E均为泛型参数,当函数操作成功时,返回Ok(T),失败时返回Err(E)。

Result搭配match可以实现对代码错误情况的处理。

unwrap与expect

unwrapexpect方法是对于match处理错误的简化,在返回Ok(T)时,unwrapexpect方法不会被触发,而但返回Err(E)时,将会导致程序panic!并可进行简单的输出。

传播错误

可以将函数返回值设置为Result类型,在出错时将错误抛出,由函数调用者进行错误处理。

泛型

可以在函数定义、方法定义、结构体定义、枚举定义时使用泛型,提高代码的利用率,避免为不同类型的变量重复实现相同的代码逻辑。

Trait

Trait即为rust中的接口Trait中可以仅有方法定义,也可实现默认方法

可以在函数方法定义中,将参数返回值声明为实现了指定Trait的类型。

Trait语法糖

  • Trait bound 语法糖
  • 通过指定多个Trait bound
  • 通过where简化Trait bount

示例:

代码语言:rust复制
//定义trait
pub trait Summary{
    fn summarize(&self) -> String {
    //do something
    }
}
// 函数定义中使用trait
pub fn notify(iterm: &impl Summary) -> impl Summary{
//do someting
}
// trait bound
pub fn notify_1<T:Summary>(iterm: &T){
//do something
}
// trait bound 与+
pub fn notify_3<T:Summary Abc>(iterm: &T){
//do something
}
//trait bound与where
pub fn notify_4<T,U>(t: &T,u: &U) -> i32
where {
T:Summary Display,
U:Display Clone,
}
{
//do something
}

生命周期

rust中的引用都有其生命周期作用域,使用超过生命周期的引用将会导致编译时报错

生命周期与泛型

需要为泛型参数添加生命周期注解,才能在函数中返回泛型引用

生命周期的省略

有一套对应的规则,满足该规则,就可以省略生命周期注解:

  • 第一条规则是编译器为每一个引用参数都分配一个生命周期参数。换句话说就是,函数有一个引用参数的就有一个生命周期参数:fn foo<'a>(x: &'a i32),有两个引用参数的函数就有两个不同的生命周期参数,fn foo<'a, 'b>(x: &'a i32, y: &'b i32),依此类推。
  • 第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:fn foo<'a>(x: &'a i32) -> &'a i32。
  • 第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 &self &mut self,说明是个对象的方法 (method),那么所有输出生命周期参数被赋予 self 的生命周期。第三条规则使得方法更容易读写,因为只需更少的符号。

0 人点赞