令人惊讶的是,我被一个 Rust 问题困住了,这个问题看起来简单得违反直觉,但我似乎无法弄清楚。我几乎开始认为它可能无法解决,但我不确定根本原因是什么(如果有的话),为什么会这样。
说我有一个特质
trait T {
fn t(&self);
}
我想实现一个通用函数
f<X>(x: &X)
,这样:
x
实现 T
,则 f
调用 x.t()
;x
未实现 T
,则 f
不执行任何操作。我感到莫名的失落。当然,由于重复的定义,
f
的两个实现将不起作用。我考虑添加一个辅助特征 H
和一些默认情况下不执行任何操作的函数 h
,然后为每个 H
实现 X: T
,重载 h
来调用 x.t()
。但是,那么每个不实现 X
的 T
也不会实现 H
,所以这没有帮助。对吗?
我错过了什么吗?实施
f
是否可行,但非常复杂?或者是否有任何根本原因导致完全不可能实施f
?
(如果可能的话,我想避免动态调度,因为这是我的代码中使用频率很高的部分。但是,在这一点上,我会尽可能地进行!)
这并不完全是您想要的,但也许它已经足够好,并且让您有机会澄清您的需求。
trait T {
fn for_real() -> bool;
fn t(&self);
}
#[derive(Debug)]
struct SpecialA;
impl T for SpecialA {
fn for_real() -> bool {
true
}
fn t(&self) {
dbg!(self);
}
}
#[derive(Debug)]
struct OrdinaryA;
impl T for OrdinaryA {
fn for_real() -> bool {
false
}
fn t(&self) {
dbg!(self);
}
}
fn f<X: T>(x: &X) {
if <X as T>::for_real() {
x.t();
}
}
fn main() {
f(&SpecialA);
f(&OrdinaryA);
}