![](/img/trans.png)
[英]How can I express a trait bound on a type parameter for another generic type's trait bound?
[英]How do I bound a generic type with a trait that requires a lifetime parameter if I create the reference inside the function?
我想實現一個通用的fibonacci
函數,該函數可與實現Zero
, One
和AddAssign
任何類型AddAssign
。 我首先實現了一個工作正常的版本,但專門用於num::BigUint
( 請參見play.rust-lang.org )。 然后,我提出了以下通用實現( 請參見play.rust-lang.org ):
extern crate num;
use num::{One, Zero};
use std::mem::swap;
use std::ops::AddAssign;
fn fib<T: Zero + One + AddAssign<&T>>(n: usize) -> T {
let mut f0 = Zero::zero();
let mut f1 = One::one();
for _ in 0..n {
f0 += &f1;
swap(&mut f0, &mut f1);
}
f0
}
這不會編譯:
error[E0106]: missing lifetime specifier
--> src/main.rs:7:34
|
7 | fn fib<T: Zero + One + AddAssign<&T>>(n: usize) -> T {
| ^ expected lifetime parameter
Rust希望我向AddAssign<&T>
添加一個生命周期參數,但是我不知道如何表達f1
的生命周期。
您需要使用較高等級特質界限 。 這基本上意味着“對於任何生命'a
, T
滿足AddAssign<&'a T>
特性”:
fn fib<T>(n: usize) -> T
where
for<'a> T: Zero + One + AddAssign<&'a T>,
我還必須更改fib
的調用方式,因為編譯器無法弄清楚返回類型,返回類型實際上可以是實現這些特征的任何類型。 聲明x
的類型為編譯器提供了足夠的上下文,以便它知道您想要什么。
fn main() {
let x: num::BigUint = fib(10);
// let x = fib::<BigUint>(10); // Also works
println!("fib(10) = {}", x);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.