gpt4 book ai didi

rust - 理解 &type + 'a 语法

转载 作者:行者123 更新时间:2023-12-05 02:28:48 37 4
gpt4 key购买 nike

我已经开始学习 Rust。目前,我正在尝试学习如何正确使用生命周期注释,并且认为我已经很好地理解了基础知识。但是,我曾多次遇到以下结构:

fn<'a> foo(a: &'a str, ...) -> &str + 'a

str 不相关,它实际上可以是任何类型,我的问题具体是 &str + 'a 是什么意思(我可能没有正确使用它,这是为什么我要问这个)而不是 &'a str。作为一个真实世界的例子,我在 this tutorial for async rust 中遇到过它他们写的地方:

fn foo_expanded<'a>(x: &'a u8) -> impl Future<Output = u8> + 'a

我推测这可能与 Future 是一个特征而不是一个类型有关,但我无法在任何官方文档中验证它,也没有找到任何来源语法是什么意思。

最佳答案

首先,您帖子中显示的语法是不允许的。

fn<'a> foo(a: &'a str, ...) -> &str + 'a

有两个原因:

  1. 必须在函数名后指定生命周期泛型。
  2. 显示的指定返回生命周期的方式只允许用于特征,而不是完整类型。

否则你会得到以下两个错误之一:

error[E0178]: expected a path on the left-hand side of `+`, not `&str`
--> ./ex_056.rs:11:43
|
11 | fn _get<'a>(ms: &'a MyStruct, s: &str) -> &str + 'a {
| ^^^^^^^^^ help: try adding parentheses: `&(str + 'a)`

error[E0404]: expected trait, found builtin type `str`
--> ./ex_056.rs:15:31
|
15 | fn _get2<'a>(s: &'a str) -> &(str + 'a) {
| ^^^ not a trait

因此它是无效的。

作为一个粗略的猜测,我想您被误导的不是完整 类型,而是trait 对象。由于在 2015 年允许使用这种表示法,但现在它已被弃用,正如您在以下警告中看到的那样:

warning: trait objects without an explicit `dyn` are deprecated
--> ./ex_056.rs:15:31
|
15 | fn _get2<'a>(s: &'a str) -> &(str + 'a) {
| ^^^^^^^^ help: use `dyn`: `dyn str + 'a`
|
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>

关于rust - 理解 &type + 'a 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72528620/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com