簡體   English   中英

如果在函數內創建引用,如何將泛型類型與需要使用生命周期參數的特征綁定在一起?

[英]How do I bound a generic type with a trait that requires a lifetime parameter if I create the reference inside the function?

我想實現一個通用的fibonacci函數,該函數可與實現ZeroOneAddAssign任何類型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的生命周期。

您需要使用較高等級特質界限 這基本上意味着“對於任何生命'aT滿足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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM