gpt4 book ai didi

rust - 结构持有的特征对象中的显式生命周期声明

转载 作者:行者123 更新时间:2023-11-29 07:50:23 25 4
gpt4 key购买 nike

在对 this question 的回答中有一个关于如何引用结构持有的特征对象的讨论,它需要以下语法:

struct Bar<'a> {
foo: &'a (Foo + 'a),
}

这是根据 RFC 438

我可以要求更多关于双重生命周期声明的解释吗?莱文斯说:

You have to specify the lifetime two times : once for the lifetime of the reference, and once for the trait object itself, because traits can be implemented for references, and if the underlying object is a reference, you must specify its lifetime as well.

我理解结构中引用的生命周期概念。但是我不明白为什么生命周期不是针对特征是特征的对象。换句话说,我不知道在没有引用作为特征的基础事物的情况下持有特征的引用是什么意思。

是否存在特征和底层对象具有不同生命周期的情况?保留对特征的引用而不保留该特征所依据的基础事物意味着什么?

换个方式问,为什么 Rust 不能做正确的事情(tm):

struct Bar<'a> {
foo: &'a Foo,
}

正确的做法 (tm) 会将其解释为等同于上述声明?

很抱歉问了很多问题,但我觉得我在做一些非常基础的事情(使用特征作为通用方面),我不得不深入探索,我想了解为什么兔子洞那么深。

错误消息:error: explicit lifetime bound required 显然没有帮助,因为已经存在生命周期限制。

最佳答案

why the lifetime isn't for the object that the trait is a trait on

因为对特征对象的引用和特征对象本身可能有不同的生命周期。下面是为引用实现的特征示例:

trait Quack {
fn quack(&self) { println!("Quack") }
}

impl<'a> Quack for &'a bool {}

struct MasterQuack<'a> {
q: &'a (Quack + 'a),
}

fn main() {
let a = true;
// a.quack(); // Nope, not defined
(&a).quack();

// MasterQuack {q: &a}; // Nope, this would be a reference to a boolean, which isn't Quack
MasterQuack {q: &&a};
}

需要注意的一件事是,拥有 &'a (Trait + 'b) 是完全没问题的——也就是说,对本身具有/的特征的引用是一个引用,而那些生命周期不同。你说的一样多

Is there a case where the trait and the underlying object would have different lifetimes?

但这更像是“底层对象具有不同生命周期的引用”的情况。

why can't Rust just do The Right Thing(tm)

截至RFC 599现在编译:

struct Bar<'a> {
foo: &'a Foo,
}

关于rust - 结构持有的特征对象中的显式生命周期声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27790168/

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