在下面的代码中,如何返回floor的引用而不是新对象?是否可以让函数返回borrow 的引用或拥有的值?

extern crate num; // 0.2.0

use num::bigint::BigInt;

fn cal(a: BigInt, b: BigInt, floor: &BigInt) -> BigInt {
    let c: BigInt = a - b;
    if c.ge(floor) {
        c
    } else {
        floor.clone()
    }
}

推荐答案

因为BigInt实现了Clone,所以可以使用std::borrow::Cow:

use num::bigint::BigInt; // 0.2.0
use std::borrow::Cow;

fn cal(a: BigInt, b: BigInt, floor: &BigInt) -> Cow<BigInt> {
    let c: BigInt = a - b;
    if c.ge(floor) {
        Cow::Owned(c)
    } else {
        Cow::Borrowed(floor)
    }
}

稍后,您可以使用Cow::into_owned()获得BigInt的自有版本,或者仅将其用作参考:

fn main() {
    let a = BigInt::from(1);
    let b = BigInt::from(2);
    let c = &BigInt::from(3);

    let result = cal(a, b, c);

    let ref_result = &result;
    println!("ref result: {}", ref_result);

    let owned_result = result.into_owned();
    println!("owned result: {}", owned_result);
}

Rust相关问答推荐

将JSON密钥转换为Polars DataFrame

如何从接收&;self的方法克隆RC

如何最好地并行化修改同一Rust向量的多个切片的代码?

如何装箱生命周期相关联的两个对象?

具有对同一类型的另一个实例的可变引用的

修改切片/引用数组

如何获取Serde struct 的默认实例

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

为什么铁 rust S似乎有内在的易变性?

如何将单个 struct 实例与插入器一起传递到Rust中的映射

由于生存期原因,返回引用的闭包未编译

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

RUST 中的读写器锁定模式

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

为什么 Rust 字符串没有短字符串优化 (SSO)?

实现AsyncWrite到hyper Sender时发生生命周期错误

无法把握借来的价值不够长寿,请解释

如何在 Rust 中使用特征标志来捕获多行代码?