gpt4 book ai didi

rust - 将特征生命周期变量绑定(bind)到 &self 生命周期

转载 作者:行者123 更新时间:2023-11-29 08:05:33 24 4
gpt4 key购买 nike

我想按照以下几行做一些事情:

trait GetRef<'a> {
fn get_ref(&self) -> &'a [u8];
}

struct Foo<'a> {
buf: &'a [u8]
}

impl <'a> GetRef<'a> for Foo<'a> {
fn get_ref(&self) -> &'a [u8] {
&self.buf[1..]
}
}

struct Bar {
buf: Vec<u8>
}

// this is the part I'm struggling with:
impl <'a> GetRef<'a> for Bar {
fn get_ref(&'a self) -> &'a [u8] {
&self.buf[1..]
}

GetRef 特征中显式生命周期变量的意义在于允许 Foo 对象上的 get_ref() 返回值比 Foo 本身长,将返回值的生命周期与 Foo 缓冲区的生命周期联系起来。

但是,我还没有找到以编译器接受的方式为 Bar 实现 GetRef 的方法。我已经尝试了上述的几种变体,但似乎找不到一种有效的方法。有什么理由说这根本无法做到吗?如果没有,我该怎么做?

最佳答案

Tying a trait lifetime variable to &self lifetime

不可能。

Is there any there any reason that this fundamentally cannot be done?

是的。拥有向量与借用的切片不同。您的特征 GetRef 仅对已经代表“贷款”且不拥有切片的事物有意义。对于像 Bar 这样的拥有类型,您无法安全地返回比 Self 还长的借用切片。这就是借用检查器为了避免悬挂指针而阻止的内容。

您尝试做的是将生命周期参数链接到 Self 的生命周期。但是 Self 的生命周期不是其类型 的属性。这仅取决于定义该值的范围。这就是您的方法无法工作的原因。

另一种看待它的方式是:在特征中,您必须明确 Self 是否被方法及其结果借用。您定义了 GetRef 特征以返回链接到 Self w.r.t 的内容。一生。所以,不借。因此,它对于拥有数据的类型是不可实现的。如果不借用 Vec,就不能创建引用 Vec 元素的借用切片。

If not, how can I do this?

取决于你所说的“这个”到底是什么意思。如果你想写一个可以为借用的 拥有的切片实现的“公分母”特征,你必须这样做:

trait GetRef {
fn get_ref(&self) -> &[u8];
}

这个 trait 的意思是 get_ref borrows Self 并且由于当前的生命周期省略规则返回一种“贷款”。相当于更明确的形式

trait GetRef {
fn get_ref<'s>(&self) -> &'s [u8];
}

现在可以为两种类型实现:

impl<'a> GetRef for Foo<'a> {
fn get_ref(&self) -> &[u8] { &self.buf[1..] }
}

impl GetRef for Bar {
fn get_ref(&self) -> &[u8] { &self.buf[1..] }
}

关于rust - 将特征生命周期变量绑定(bind)到 &self 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28640286/

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