具有多个成员的 Rust 特征,默认实现,相互依赖

问题描述 投票:0回答:1

假设我想引入一个具有两种方法的特征,这两种方法在某种意义上是相互依赖的,其中一个可以默认使用另一个来实现。例如:

use std::io;

trait SpecificSerializationStrategy: Sized {
  fn deserialize_slice(bytes: &[u8]) -> Self {
    // IO operations on inmemory buffers are infallible
    Self::deserialize_stream(bytes).unwrap()
  }

  fn deserialize_stream(mut stream: impl io::Read) -> io::Result<Self> {
    let mut bytes = vec![];
    stream.read_to_end(&mut bytes)?;    

    Ok(Self::deserialize_bytes(&bytes))
  }
}

这种情况不仅限于序列化,而且在某些板条箱中经常会遇到(不幸的是,我不记得这样的确切例子,但一旦遇到它们我会立即更新这个问题)。

显然,如果至少有一个函数没有实现,这种默认实现会导致无限递归。但是当我之前使用这种模式时,Rust 编译器能够识别这种情况,并要求实现至少一个相互依赖的成员类型。

我不确定发生了什么变化,但现在,这种默认实现的情况已经过去了。

是编译器发生变化吗?或者我是否缺少特征定义的某些特定属性/只是错误地执行了此模式?

rust traits
1个回答
0
投票

这从来没有成功过。

语言设计者对这个用例很感兴趣(至少最初对于

std::io::Read
,它也有这种带有
read()
read_buf()
的模式),并且它在夜间可以作为特征上的
#[rustc_must_implement_one_of(deserialize_slice, deserialize_stream)]
使用,但这个属性是内部的,目前没有公开。

© www.soinside.com 2019 - 2024. All rights reserved.