Возврат заимствованного или принадлежащего типа в ржавчине
В следующем коде, как я могу вернуть ссылку 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 ответ:
Поскольку
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); } }