gpt4 book ai didi

rust - 如何在Rust中为特定类型覆盖特征实现?

转载 作者:行者123 更新时间:2023-12-03 11:48:58 24 4
gpt4 key购买 nike

在下面的示例中,实现其中一个特征将起作用。编译器不允许覆盖特定类型的实现。

还有其他方法可以做到这一点吗?

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)]。可能会有一个更优雅的解决方案(将等待对此有更多了解的人)。

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

关于rust - 如何在Rust中为特定类型覆盖特征实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61425762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com