假设我想引入一个具有两种方法的特征,这两种方法在某种意义上是相互依赖的,其中一个可以默认使用另一个来实现。例如:
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 编译器能够识别这种情况,并要求实现至少一个相互依赖的成员类型。
我不确定发生了什么变化,但现在,这种默认实现的情况已经过去了。
是编译器发生变化吗?或者我是否缺少特征定义的某些特定属性/只是错误地执行了此模式?
这从来没有成功过。
std::io::Read
,它也有这种带有read()
和read_buf()
的模式),并且它在夜间可以作为特征上的#[rustc_must_implement_one_of(deserialize_slice, deserialize_stream)]
使用,但这个属性是内部的,目前没有公开。