是否可以在 Rust 中返回借用或拥有的类型?

Posted

技术标签:

【中文标题】是否可以在 Rust 中返回借用或拥有的类型?【英文标题】:Is it possible to return either a borrowed or owned type in Rust? 【发布时间】:2016-08-10 22:13:16 【问题描述】:

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

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()
    

【问题讨论】:

【参考方案1】:

由于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 中返回借用或拥有的类型?的主要内容,如果未能解决你的问题,请参考以下文章

Rust学习教程 - 引用与借用

rust单元类型

rust替换函数名

Rust Deref与自动解引用

Rust 无法推断通用特征 impl 的返回类型

为啥 Rust 的示例猜谜游戏允许具有不同返回类型的 match 语句?