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

锈蚀寿命误差预期混凝土寿命但发现约束寿命

令狐翰
2023-03-14

我有一个问题与生命周期参数的结构。我不能100%确定如何描述这个问题,但是我创建了一个显示编译时错误的简单案例。

struct Ref;

struct Container<'a> {
  r : &'a Ref
}

struct ContainerB<'a> {
  c : Container<'a>
}

trait ToC {
  fn to_c<'a>(&self, r : &'a Ref) -> Container<'a>;
}

impl<'a> ToC for ContainerB<'a> {
  fn to_c(&self, r : &'a Ref) -> Container<'a> {
    self.c
  }
}

我得到的错误是

test.rs:16:3: 18:4 error: method `to_c` has an incompatible type for trait: expected concrete lifetime, but found bound lifetime parameter 'a
test.rs:16   fn to_c(&self, r : &'a Ref) -> Container<'a> {
test.rs:17     self.c
test.rs:18   }
test.rs:16:48: 18:4 note: expected concrete lifetime is the lifetime 'a as defined on the block at 16:47
test.rs:16   fn to_c(&self, r : &'a Ref) -> Container<'a> {
test.rs:17     self.c
test.rs:18   }
error: aborting due to previous error

我尝试了很多变体,只是无法编译这个东西。我在这里找到了另一个帖子(如何修复:预期的具体寿命,但找到了绑定的寿命参数),但似乎绕过了问题,而不是解决它。我真的不明白为什么这个问题会出现。该

有什么想法吗?谢谢你的帮助。

共有1个答案

单琛
2023-03-14

让我们比较一下这两个定义。首先,特质方法:

fn to_c<'a>(&self, r: &'a Ref) -> Container<'a>;

和实施:

fn to_c(&self, r: &'a Ref) -> Container<'a>;

看出区别了吗?后者没有

在功能上,trait定义表示返回的容器将在其中引用来自r的内容,但没有来自Self的内容。它可以在方法内部使用Self,但是它不能在返回的值中存储对它的任何引用。

然而,您的方法定义使用的是一个'a,它将r和返回的Container的生命周期与自己联系起来(也就是说,与对象本身联系起来,而不是引用-<代码>

通过插入

impl<'b> ToC for ContainerB<'b> {
    fn to_c<'a>(&self, r: &'a Ref) -> Container<'a> {
        self.c
    }
}

但是现在您当然有一个问题:返回值的类型是Container

解决此问题的一种方法是指定

当你不熟悉这些事情时,你很难去思考它们;但随着时间的推移,它们变得相当自然。

 类似资料:
  • 虽然下面的代码是一个早期的原型,对于我在这个阶段如何实现协议缓冲区不必太认真,但我无法理解rust编译器给我带来的错误消息指的是什么。 src\main。rs:89:9:89:36错误:解决的类型不匹配

  • 我无法计算出这段代码的生存期参数。我所尝试的一切通常都会导致编译器错误:“预期的绑定生存期参数,找到了具体的生存期”或者类似于“考虑使用所示的显式生存期参数”(所示的示例没有帮助)或“与trait不兼容的方法”。 、和都是简化版本,以尽量减少此示例。 铁锈游乐场

  • 此代码基于生存期章节中Rust书中的示例代码。我想知道相同方法的以下两个版本有何不同: 对 我猜在第一个版本中,我们指示编译器 > 查找生存期,使两者都 确保返回的引用仅在该生命周期内使用,因为在该生命周期之外,它可能会成为悬空引用。 代码的第二个版本是做什么的?Rust书中的生命周期省略规则之一说,在结构方法中,返回的引用被分配了

  • 我已经在锈菌上试验了很长时间了。关于铁锈的寿命有一种混淆。查看以下代码: string2的生存期在内部作用域之后结束,结果在外部作用域中定义。在println!中传递结果时!,编译不会抱怨,而是继续并打印结果。但是,当我将string2更改为: 借书人会投诉的。为什么会这样。

  • 我正在尝试在结构中存储函数: 编译器抱怨:

  • 问题内容: 我目前正在尝试诊断应用程序中的缓慢内存泄漏。到目前为止,我掌握的事实如下。 我有4天运行该应用程序的堆转储。 该堆转储包含约800个WeakReference对象,这些对象指向保留40mb内存的对象(所有对象都是同一类型,出于这个问题的目的,我将其称为Foo)。 Eclipse内存分析工具显示,这些WeakReferences引用的每个Foo对象均未被其他任何对象引用。我的期望是,这应