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

当回归保守的impl特质时,一生意味着什么?

韦修文
2023-03-14

在搜索有关保守impl-trait的文档时,我发现了以下示例:

struct A {
    x: [(u32, u32); 10]
}

impl A {
    fn iter_values<'a>(&'a self) -> impl 'a + Iterator<Item = u32> {
        self.x.iter().map(|a| a.0)
    }
}

生存期'a在返回类型中是什么意思?

我知道这个关于生命周期限制的问题,但我认为用例是不同的。如果我能很好地理解答案:

trait对象仅对生存期“a”有效

这意味着位于堆中某处的trait对象将在生命周期中持续一段时间。

但在这里,这不是特征对象,而是堆栈中的具体对象。因此编译器不需要有关于其生存期的提示。

我错过了什么?

共有2个答案

韶硕
2023-03-14

这意味着位于堆中某处的trait对象将在生命周期中持续一段时间。

不完全是。

这里并没有确切地指定,它只对对象的生存期设置了一个上限。对象是位于堆上还是堆栈上并不重要:编译器必须确保此对象的生存期不超过a。

生存期表示引用对象和引用对象之间的关系,用于确保引用对象永远不会超过引用对象。因此,它对被引用的生命周期设置了上限,对被引用的生命周期设置了下限。

编译器可以从函数返回的实际具体类型中派生必要的生命周期,但是它需要类型检查器能够查看函数实现以执行其工作。

因此,在接口边界处记录生存期约束对人类和编译器都更加友好:它允许局部推理。

诸葛砚文
2023-03-14

语法impl迭代器

  • 将返回函数定义的某些类型,但您不知道确切的类型。这就是 零件

在您的示例中,返回的迭代器包含对self的引用,因此不能允许它比A的实例存在更长时间,否则它将无效。具体类型(如果我们可以编写它)将是iter::Map

这意味着位于堆中某处的trait对象将在生命周期中持续一段时间。

这并不完全正确。这两种情况的含义相同:未指定的具体类型可能包含引用。对于trait对象,具体类型位于某种指针的后面(框,

这不是特征对象,而是堆栈中的具体对象

Trait对象不需要堆;它们只能使用堆栈:

let x: &std::fmt::Display = &42;
println!("{}", x);

另请参见:

  • 为什么Rust需要显式生命周期

 类似资料:
  • 我在React教程上看过这个。这是什么意思? 反应是安全的。我们没有生成HTML字符串,因此XSS保护是默认设置。 如果 React 是安全的,XSS 攻击如何工作?如何实现这种安全性?

  • 我想创建一个

  • 嗨,我正在读取BLE血糖仪的数据。当我试图阅读“00002a18-0000-1000-8000-00805f9b34fb”的特征时,它只是血糖测量UUID,特征。getProperties方法返回16,并且没有调用我的onCharacteristicRead方法本身。请帮助我如何读取BLOOD\u GLUCOSE\u测量特征。 我的读特征方法是 我的setCharacteristicNotific

  • 问题内容: 我刚刚看到一个成员函数,如下所示: 但是Cat是这样的接口: 因此,我对如何解释这一点感到困惑。我知道什么东西返回一个对象或原语是什么意思。但是返回接口意味着什么?如何使用此函数的返回值? 问题答案: 考虑一下这种方式:如果在常规类的哪里,当您想在其上调用某些方法时,您 究竟 在乎什么呢? 您会关心方法定义:它们的名称,它们的参数类型,它们的返回值。你 并不 需要关心实际的实现! 由于

  • 问题内容: 我正在审查为准备明天早上的期末考试而做的期中考试。我把这个问题弄错了,但是没有指出正确的答案,因此我忽略了询问教授。 考虑以下代码片段: 以下有关该代码的下列哪项正确? 主要方法旨在捕获和处理所有类型的异常。 主要方法是设计用来捕捉和处理鱼。 如果出现这种情况,则main方法应该简单地终止。 如果发生任何异常,main方法应该简单地终止。 我选择了第二个选项。 问题答案: 答案是数字4

  • 我想这意味着查询已经执行,MySQL正在向客户机发送“结果”数据,但我想知道为什么要花这么多时间(长达一个小时)。 谢谢你。