繁体   English   中英

如何覆盖 Rust 中特定类型的特征实现?

[英]How to override trait implementations for specific types in Rust?

在下面的示例中,实现这些特征中的任何一个都可以。 编译器不允许覆盖特定类型的实现。

有没有其他方法可以实现这一目标?

trait Giver<T,U> {
    fn give_first(&self) -> T;
    fn give_second(&self) -> U;
}

struct Pair<T,U>(T,U);

impl<T,U> Giver<T,U> for Pair<T,U> where T:Clone, U:Clone {
    fn give_first(&self) -> T {
        (self.0).clone()
    }

    fn give_second(&self) -> U {
        (self.1).clone()
    }
}

//works 
impl Giver<i32, i32> for Pair<f32, f32> {
    fn give_first(&self) -> i32 {
        1
    }

    fn give_second(&self) -> i32 {
        2
    }
}


//error[E0119]: conflicting implementations of trait `Giver<f32, f32>` for type `Pair<f32, f32>`:
impl Giver<f32, f32> for Pair<f32, f32> {
    fn give_first(&self) -> f32 {
        1.0
    }

    fn give_second(&self) -> f32 {
        2.0
    }
}
#![feature(specialization)]

trait Giver<T,U> {
    fn give_first(&self) -> T;
    fn give_second(&self) -> U;
}

#[derive(Debug)]
struct Pair<T,U>(T,U);

impl<T,U> Giver<T,U> for Pair<T,U> where T:Clone, U:Clone {
    default fn give_first(&self) -> T {
        (self.0).clone()
    }

    default fn give_second(&self) -> U {
        (self.1).clone()
    }
}

impl Giver<i32, i32> for Pair<f32, f32> {
    fn give_first(&self) -> i32 {
        1
    }

    fn give_second(&self) -> i32 {
        2
    }
}


impl Giver<f32, f32> for Pair<f32, f32> {
    fn give_first(&self) -> f32 {
        3.0
    }

    fn give_second(&self) -> f32 {
        4.0
    }
}

fn main() {
    {
        let p = Pair(0.0, 0.0);
        let first: i32 = p.give_first();
        let second: i32 = p.give_second();
        println!("{}, {}", first, second);  // 1, 2
    }

    {
        let p: Pair<f32, f32> = Pair(0.0, 0.0);
        let first: f32 = p.give_first();
        let second: f32 = p.give_second();
        println!("{}, {}", first, second);  // 3, 4
    }
}

如果我们明确指定预期的返回类型,rust nightly 似乎支持它。 我用#![feature(specialization)]试过了。 可能有一个更优雅的解决方案(等待对此有更多了解的人)。

output: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=d618cd9b534a5ba49199a2efdcf607bd

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM