gpt4 book ai didi

rust - 如何编写将 `self` 作为可变特征引用添加到集合的方法?

转载 作者:行者123 更新时间:2023-11-29 08:22:54 25 4
gpt4 key购买 nike

我有一个特征 Foo 和一个结构 BarBar 有一个 Vec 字段,它包含任何实现 Foo 的引用。

trait Foo { }

struct Bar<'a> {
handlers: Vec<&'a mut Foo>,
}

我有另一个结构 Stu 实现了 Foo,并且有一个方法 add 将它自己添加到 bar .

struct Stu { }

impl Foo for Stu { }

impl Stu {
fn add(&mut self, bar: &mut Bar) {
bar.handlers.push(&mut self);
}
}

因为实现 Foo 的结构有很多种,而且在 add 方法中完成的 Action 各不相同,我需要一个包含所有这些结构的结构(即 Bar 这里),上面的代码是我写的。但是编译器提示:

the trait bound &mut Stu: Foo is not satisfied

我该如何解决这个问题或实现我想要的最终目标?

最佳答案

仔细阅读错误方法:

the trait bound &mut Stu: Foo is not satisfied

对比:

impl Foo for Stu { }

你已经为 Stu 实现了 Foo,而不是为 &mut Stu

在 Rust 中,值、不可变引用和可变引用是三个不同的实体,您可以独立地为它们中的任何一个实现特征。


第二个极端情况是 &mut self 不是模式匹配。在常规模式匹配中,&mut a: &mut A 表示 aA 类型,实际上是 other参数都是这样处理的。

然而,令人困惑的是,&mut self 只是 self: &mut Self...

的语法糖

所以这里的 self 类型是 &mut Stu,因此你不应该在 push 调用中进一步限定它。


因此,您必须将代码更正为:

impl Stu {
fn add(&mut self, bar: &mut Bar) {
bar.handlers.push(self);
}
}

此时,你会得到一个关于生命周期约束的错误:这里不保证self会比Bar长寿。您需要对其进行注释(使用相同的生命周期)以使其工作:

impl Stu {
fn add<'a>(&'a mut self, bar: &mut Bar<'a>) {
bar.handlers.push(self);
}
}

注意:注解生命周期时,不必全部注解;只需要为那些你想约束的人插入一个名字。

关于rust - 如何编写将 `self` 作为可变特征引用添加到集合的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38078058/

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