Rust代码示例——15.4.7.生命周期强制转换(Coercion)

生命周期可以强制在短生命周期内转化为更长的生命周期,以便可以在本不能工作的作用域中可以正常使用。这可以使用编译器自动推断进行强制转换,也可以进行生命周期的声明来表示其不同。

// Here, Rust infers a lifetime that is as short as possible.

// The two references are then coerced to that lifetime.

fn multiply<'a>(first: &'a i32, second: &'a i32) -> i32 {

    first * second

}


// `<'a: 'b, 'b>` reads as lifetime `'a` is at least as long as `'b`.

// Here, we take in an `&'a i32` and return a `&'b i32` as a result of coercion.

fn choose_first<'a: 'b, 'b>(first: &'a i32, _: &'b i32) -> &'b i32 {

    first

}


fn main() {

    let first = 2; // Longer lifetime

    

    {

        let second = 3; // Shorter lifetime

        

        println!("The product is {}", multiply(&first, &second));

        println!("{} is the first", choose_first(&first, &second));

    };

}
代码解析
核心概念图
长生命周期 '长

└─ 可强制转换为短生命周期 '短

   └─ 确保在短生命周期作用域内安全使用
编译器自动生命周期推断
fn multiply<'a>(first: &'a i32, second: &'a i32) -> i32 {

    first * second

}

// 编译器行为:

// 1. 自动计算两个参数的最小公共生命周期

// 2. 将两个引用统一为该生命周期

// 示例:当传入长生命周期(&first)和短生命周期(&second)引用时,自动统一为短生命周期
显示生命周期约束
fn choose_first<'a: 'b, 'b>(first: &'a i32, _: &'b i32) -> &'b i32 {

    first

}

// 语法解读:

// 'a: 'b 表示 "'a生命周期至少与'b一样长"

// 效果:允许将长生命周期引用安全转换为短生命周期
主函数
fn main() {

    let first = 2; // 长生命周期(外层作用域)

    

    {

        let second = 3; // 短生命周期(内层作用域)

        

        // 情况1:自动统一生命周期(采用second的短生命周期)

        multiply(&first, &second); // first被隐式转换

        

        // 情况2:显式将first转换为当前块的生命周期

        choose_first(&first, &second); // 返回&'b i32

    };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值