在特征TraitA也被实现的情况下,是否可以定义特征TraitB的功能/方法fun_b的默认实现? 下面我定义了一个带有超级特征TraitA的额外特征TraitBDerived,但我希望这个潜在的默认实现是透明的,因为不需要使用另一个特征.

trait TraitA {
    fn fun_a() -> String;
}

trait TraitB {
    fn fun_b() -> String;
}

trait TraitBDerived: crate::TraitA {
    fn fun_b() -> String {
        String::from("prefix ").add(&Self::fun_a())
    }
}

推荐答案

只需按照标准库中的方法进行-对实现TraitA的所有类型实现TraitB,例如,参见Playground

但是请注意,您无法为所有类型实现外部特征,只能为您定义的特征.

use std::ops::Add;

trait TraitA {
    fn fun_a() -> String;
}

trait TraitB {
    fn fun_b() -> String;
}

impl<T> TraitB for T where T: TraitA {
    fn fun_b() -> String {
        String::from("prefix ").add(&Self::fun_a())
    }
}

impl TraitA for i32 {
    fn fun_a() -> String { "TraitA".to_owned() }
}

impl TraitB for usize {
    fn fun_b() -> String { "TraitB".to_owned() }
}


fn main(){
    println!("{}", i32::fun_a()); // TraitA
    println!("{}", i32::fun_b()); // prefix TraitA
    //println!("{}", usize::fun_a()); // not implemented
    println!("{}", usize::fun_b()); // TraitB
}

Rust相关问答推荐

是否可以为`T:Copy`执行`T. clone`的测试

为什么BitVec缺少Serialize trait?

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

取得本地对象字段的所有权

在rust sqlx中使用ilike和push bind

`RwLockWriteGuard_,T`不实现T实现的特征

用于判断整数块是否连续的SIMD算法.

如何初始化选项<;T>;数组Rust 了?

Rust移动/复制涉及实际复制时进行检测

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

如何返回 struct 体中向量的切片

从 rust 函数返回 &HashMap

如何在 Rust 中将函数项变成函数指针

Rust 如何返回大类型(优化前)?

将泛型中的 Box 转换为 rust 中的 Box

为什么我不能克隆可克隆构造函数的Vec?

是否可以预测堆栈溢出?

返回引用字符串的future

使用部分键从 Hashmap 中检索值

在 Rust 中退出进程