我不确定设计模式叫什么,但我有一个不可变的数据 struct S,它有一个名为update的异步方法,它返回Result<Self>(基本上是克隆自身并应用由方法参数表示的更新).我想将这update routine 移到特征中,但遇到了问题,因为有很多地方要求特征是对象安全的,但很明显,返回类型中的Self不是对象安全的.

"traifying"这个方法的目的是我想在不同的地方引用trait,这样我就可以在代码的其余部分不关心的情况下交换正在使用的实现.

我猜这就是存在主义类型可能解决的问题,但我很好奇现在是否有一种方法可以使我的代码个性化.如果我不是以一种"Rust "的方式做事,我很乐意按需要重组S,但我想知道,这在今天的"铁 rust "中是不是不可能的:

推荐答案

如果您只想要特征上的方法,而不关心调用特征对象上的方法,那么可以显式地从具有Self: Sized约束的特征对象中省略所讨论的方法.

trait MyTrait {
  // ... Other object-safe methods
  fn update(&self) -> Result<Self> where Self: Sized;
}

Self: Sized约束显式 Select 退出动态分派,并从特征对象中删除该方法.

如果你do需要它在trait对象中,你需要有点创造性.Trait对象不能返回Self,所以你得聪明一点.dyn-clone crate为Clone trait做了这件事,但它使用宏将所有内容粘合在一起.我不确定是否有一种方法可以绕过使用宏来处理这类事情,完全通用.

Rust相关问答推荐

Rust,polars CSV:有没有一种方法可以从impll BufRead(或任何字节迭代器)中读取CSV?

如何在tauri—leptos应用程序中监听后端值的变化?""

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

使用pyo3::Types::PyIterator的无限内存使用量

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

为潜在的下游实现使用泛型绑定而不是没有泛型绑定的trait

在0..1之间将U64转换为F64

铁 rust 中双倍或更多换行符的更好练习?

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

带引脚和不带引脚的比较功能

提取指向特征函数的原始指针

在 Rust 中,在第一个空格上分割字符串一次

Button.set_hexpand(false) 不会阻止按钮展开

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

如何在 Rust 中将 Vec> 转换为 Vec>?

Rust 中的let是做什么的?

如何为枚举中的单个或多个值返回迭代器

将数据序列化为 struct 模型,其中两个字段的数据是根据 struct 中的其他字段计算的

为什么 std::iter::Peekable::peek 可变地borrow self 参数?