簡體   English   中英

如何指定一個帶引用的閉包,並返回實現與引用具有相同生命周期的特征的任何類型?

[英]How do I specify a closure that takes a reference and returns any type implementing a trait with the same lifetime as the reference?

我需要告訴編譯器F返回實現SomeTrait的生命周期'a

trait SomeTrait {}

fn foo<P, Q, F>(func: F)
where
    Q: SomeTrait,
    F: for<'a> Fn(&'a P) -> Q + 'a,
{}

但我得到這個錯誤:

error[E0261]: use of undeclared lifetime name `'a`
 --> src/main.rs:6:33
  |
6 |     F: for<'a> Fn(&'a P) -> Q + 'a,
  |                                 ^^ undeclared lifetime

這就像它不理解Q + 'a

Q不是特征,它是一種類型; T: Q + 'a類的東西沒有意義。

如果你嘗試F: for<'a> Fn(&'a P) -> (Q + 'a)你會得到:

error[E0404]: expected trait, found type parameter `Q`

你的例子實際上像F: (for<'a> Fn(&'a P) -> Q) + 'a一樣解析F: (for<'a> Fn(&'a P) -> Q) + 'a - 並且很明顯為什么這不起作用。

現在:

我需要告訴編譯器F返回實現具有生命周期'a SomeTrait東西。

除了將這些生命周期用於引用或通用生命周期參數之外,您的函數不能返回不同類型,具體取決於(傳遞)生命周期。 您可以編寫一個完全忽略生命周期的Rust編譯器,如果原始程序有效,它仍然可以執行相同的操作。

對於生命周期或類型,無法指定采用泛型參數的類型參數。

如果有,它可能看起來像這樣:

trait SomeTrait {}

fn foo<P, for<'a> Q<'a>, F>(func: F)
where
    for<'a> Q<'a>: SomeTrait,
    for<'a> F: Fn(&'a P) -> Q<'a>,
{
}

生命期只能用於參考 將行更改為此作品:

F: for<'a> Fn(&'a P) -> &'a Q

一個對象本身沒有“生命周期” - 它一直存在直到被丟棄。 但是,借用檢查器必須被告知參考對象相對於其他引用對象指向生命的時間長度。 就是生命進入地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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