当前位置: 首页 > 知识库问答 >
问题:

何时需要指定Rust中的显式生存期?

束高雅
2023-03-14

如果我有这两个功能

// implicit
fn foo(x: &i32) {
}

// explicit
fn bar<'a>(x: &'a i32) {
}

什么时候会返回错误并且条形图是正确的函数标题?我很困惑,为什么我要明确地宣布一生:

“a”读取“生命周期a”。从技术上讲,每个引用都有一些与之相关的生存期,但编译器允许您在常见情况下省略它们。

我知道什么是生命周期,但明确指定生命周期'a对我有什么作用?作为参考,我用铁锈书作为阅读材料

共有1个答案

陆仲渊
2023-03-14

实际上,您必须编写生存期注释的第一个原因是编译器要求您这样做。它将拒绝终身省略规则未涵盖的函数签名。

我想你会喜欢一个简单的例子,其中生命周期是强制性的。设想以下场景:

struct Blah<'a> {
    hoy: &'a u8
}

fn want_a_hoy(blah: &Blah) -> &u8 {
    blah.hoy
}

意图很明显,但编译器不处理它:

<anon>:7:35: 7:38 error: missing lifetime specifier [E0106]
<anon>:7     fn want_a_hoy(blah: &Blah) -> &u8 {
                                           ^~~
<anon>:7:35: 7:38 help: see the detailed explanation for E0106
<anon>:7:35: 7:38 help: this function's return type contains a borrowed value, but 
                        the signature does not say which one of `blah`'s 2 elided 
                        lifetimes it is borrowed from

在这种情况下,注释可以解决问题:

fn want_a_hoy<'a, 'b>(blah: &'b Blah<'a>) -> &'a u8 {
    blah.hoy
}

这里您指定了两次a

 类似资料:
  • 我已经探索了很多,我发现在所有活动中,我们需要指定android:导出参数。我已经在清单中的所有活动中添加了参数,但我仍然收到此错误。 清单合并失败:android:需要为显式指定导出

  • 我已经检查了清单中的所有活动。xml文件中,所有活动都存在android:exported=“true”,但它始终显示此错误**清单合并失败:需要为元素显式指定android:exported 我的清单文件是 Gradle构建 等待早期响应

  • 当我从升级到时,我收到了这个错误。 错误 清单合并失败:android:导出需要显式指定。当相应组件定义了意图过滤器时,面向Android 12及更高版本的应用需要为指定显式值。有关详细信息,请参阅https://developer.android.com/guide/topics/manifest/activity-element#exported。

  • 当我将目标和编译SDK版本从30更改为31时,我得到一个错误。类似于这个问题,但没有答案。 错误:android:导出需要显式指定。针对Android 12及更高版本的应用程序需要指定一个显式值为时,相应的组件定义了一个意图过滤器。详见https://developer.android.com/guide/topics/manifest/activity-element#exported。 但是,

  • 当我更改目标并将SDK版本从30编译为31时,我得到了一个错误。类似于这个问题,但它没有答案。 错误:android:exported需要为显式指定。当相应的组件定义了意图过滤器时,针对Android 12和更高版本的应用需要为< code>android:exported指定一个显式值。详见https://developer . Android . com/guide/topics/manife

  • 问题内容: 我的印象是,在URL属性(如hrefs)中使用JavaScript时,我只需要指定“协议”。这是唯一的“有用”上下文吗? 明智的: 愚蠢: 这是正确的吗?还是我需要注意一些晦涩的错误/用例? 问题答案: 事件处理程序上的伪协议将仅被忽略,您不需要它,JavaScript引擎将解释为LabelStatement。 标签只是为语句提供标识符,并允许您在程序的其他位置引用它。 恕我直言,此伪