Возврат заимствованного или принадлежащего типа в ржавчине


В следующем коде, как я могу вернуть ссылку floor вместо нового объекта? Можно ли позволить функции возвращать либо заимствованную ссылку, либо собственное значение?

Груз.toml

[dependencies]
num = "0.1.32"

Main.rs

extern crate num;
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()
    }
}
1 7

1 ответ:

Поскольку BigInt реализует Clone, можно использовать std::borrow::Cow:

extern crate num;

use num::bigint::BigInt;
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);
    }
}