rust 如何在创建默认trait实现时避免冲突的实现?

zzzyeukh  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(95)

我正在尝试为Rust中的trait创建一个默认实现,沿着一个仅适用于某些类型的实现。
假设我在这里有这个rust代码:

trait Foo {
    fn function();
}

impl<T> Foo for T {
    fn function() {
        println!("any type")
    }
}

impl<T: From<f32>> Foo for T {
    fn function() {
        println!("only f32 related types")
    }
}

这导致了冲突的实现。有没有办法解决这个问题?

jhdbpxl9

jhdbpxl91#

由于 any type 的默认实现不使用任何特定于这种类型的东西,因此您可以直接在trait中定义默认实现。
这样做,你可以为你自己的类型实现这个trait,而不需要重新定义相同的函数。
然而,对于其他类型(来自另一个crate),这是不可能的,因为没有什么可以保证这样的类型不会在该crate的未来版本中实现From<f32>。如果发生这种情况,这两个实现将是冲突的。

trait Foo {
    fn function(&self) {
        println!("any type")
    }
}

impl<T: From<f32>> Foo for T {
    fn function(&self) {
        println!("only f32 related types")
    }
}

struct MyType(i32);
impl Foo for MyType {}

fn main() {
    let i = 12.34_f32;
    i.function();
    let m = MyType(123);
    m.function();
}
/*
only f32 related types
any type
*/

相关问题