创建默认特征实现时如何避免实现冲突?

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

我正在尝试为 Rust 中的特征创建一个默认实现,以及仅适用于某些类型的默认实现。

假设我这里有这个 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")
    }
}

这会导致实施上的冲突。有办法解决这个问题吗?

rust traits
1个回答
0
投票

由于 any type 的默认实现不使用特定于该类型的任何内容,因此您可以直接在特征中定义默认实现。

这样做,您可以为自己的类型实现此特征,而无需重新定义相同的函数。

但是,对于其他类型(来自其他板条箱)来说这是不可能的,因为没有任何东西可以保证这样的类型不会在未来版本中实现

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
*/
© www.soinside.com 2019 - 2024. All rights reserved.