如果实现了 Rust 特征,则调用函数,否则不执行任何操作

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

令人惊讶的是,我被一个 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

(如果可能的话,我想避免动态调度,因为这是我的代码中使用频率很高的部分。但是,在这一点上,我会尽可能地进行!)

rust traits default-implementation
1个回答
0
投票

这并不完全是您想要的,但也许它已经足够好,并且让您有机会澄清您的需求。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.