当前位置: 首页 > 知识库问答 >
问题:

为所有类型实现一个trait实现一个trait

淳于禄
2023-03-14

我有一个问题:

  • 多个结构实现一个trait事件
  • 都可以以相同的方式实现PARTALEqtrait

我考虑过写这个(简短版本)

type Data = Vec<u8>;

trait Event {
    fn data(&self) -> &Data;
}

struct NoteOn {
    data: Data,
}
struct NoteOff {
    data: Data,
}
impl Event for NoteOn {
    fn data(&self) -> &Data {
        &self.data
    }
}
impl Event for NoteOff {
    fn data(&self) -> &Data {
        &self.data
    }
}
impl<T: Event> PartialEq for T {
    fn eq(&self, b: &T) -> bool {
        self.data() == b.data()
    }
}

fn main() {
    println!("Hello, world!");
}

游戏场

这无法编译:

error[E0119]: conflicting implementations of trait `std::cmp::PartialEq<&_>` for type `&_`:
  --> src/main.rs:23:1
   |
23 | impl<T: Event> PartialEq for T {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: conflicting implementation in crate `core`:
           - impl<A, B> std::cmp::PartialEq<&B> for &A
             where A: std::cmp::PartialEq<B>, A: ?Sized, B: ?Sized;
   = note: downstream crates may implement trait `Event` for type `&_`

error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
  --> src/main.rs:23:1
   |
23 | impl<T: Event> PartialEq for T {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
   |
   = note: only traits defined in the current crate can be implemented for a type parameter

这里怎么了?或者有没有其他方法可以通用地实现此PartialEq,而不必为NoteOnNoteff分别键入一次?

谢谢你们

共有1个答案

堵昊焱
2023-03-14

这是我最好的“尝试”,以一种可能的方式去做我想做的事情,但在“特伦特尔”和“谢普马斯特”的评论之后,我用了不同的方式。

我使用了@trentctl提到的枚举,以便能够在不同类型之间切换,我将枚举值保留在公共结构事件中,以便可以轻松地包装不同的对象并向事件添加更多代码。这样做也有助于创建一个简单的Vec类型。

在这里,我想我只需要枚举,而不是事件和枚举的属性,我仍然在学习枚举的变体用法

@trentcl也提到了我不拥有Vec类型的问题,因此我将Vec包装在一个struct-Sec中,而不是简单地为该类型添加别名。这使得我的PartialEq实现与Vec类型分离(如果我理解,但我不确定)=

=

https://play.rust-lang.org/?version=stable

type Data = Vec<u8>;

#[derive(Debug)]
enum EventImpl{
    NoteOn(u8),
    NoteOff(u8)
}
#[derive(Debug)]
struct Event{
    data:Data,
    i:EventImpl
}

impl Event{
    fn new(data:Data)->Self{
        Event{
            i: match data[0]{
                0 => EventImpl::NoteOn(data[1]),
                1 => EventImpl::NoteOff(data[1]),
                _ => panic!("unk")
            },
            data:data
        }
    }

    fn data(&self)->&Data{
        &self.data
    }
}
#[derive(Debug)]
struct Seq{
    pub things:Vec<Event>
}

impl PartialEq for Seq{
    fn eq(&self,o:&Self)->bool{
    // i have to learn the iterator implementation    
        let mut r=o.things.len()==self.things.len();
        if ! r{
            return false;
        }
        for i in 0..o.things.len() {
            r = r && o.things[i]==self.things[i];
        }
        r
    }
}
impl PartialEq for Event{
    fn eq(&self,o:&Self)->bool{
    // i have to learn the iterator implementation    
        std::mem::discriminant(&self.i) == std::mem::discriminant(&o.i) && o.data()==self.data()
    }
}


fn main() {
    let mut s:Seq=Seq{things:vec![Event::new(vec![1,2,3])]};
    s.things.push(Event::new(vec![0,1,2]));
    let s2:Seq=Seq{things:vec![Event::new(vec![1,2,3]),Event::new(vec![0,1,2])]};

    println!("Hello, world! {:?} {:?}",s, s.things[1].data());
    println!("S1 == S2 ? {}",s==s2);
}

 类似资料:
  • 我有广泛的基本特征。有些类型只关心其功能的子集,所以我添加了一个子集,要求用户实现更小的功能集。 此代码失败: 出现以下错误: 有趣的是,当我删除上的通用性时,它就起作用了: stackoverflow上的其他一些帖子也提到了类似的问题,但它们通常都有关于外来特征的问题(来自标准库的)。在我的案例中,特质和类型都是本地的,因此就我所知,孤儿规则不应该生效。 基本上,错误提到下游板条箱可能实现tra

  • 我有一种叫做睡眠的特质: 我可以为每个结构提供不同的睡眠实现,但事实证明,大多数人的睡眠方式很少。你可以睡在床上: 如果你在露营,你可以睡在帐篷里: 有一些奇怪的情况。我有一个朋友可以靠墙睡觉,但大多数人,大多数时候,都会陷入一些简单的情况。 我们定义一些结构,让它们Hibernate: 呃-哦!编译错误: 这个编译器错误很奇怪,因为如果一个trait实现另一个trait时出现了问题,我希望在我这

  • 我有两种方法的特点。实现此特性的某些结构(但不是所有结构)对其中一种方法具有相同的实现: 该示例中有三个结构,每个结构都实现了trait,其中两个结构以完全相同的方式实现了方法。 有没有办法让他们共享该函数的代码? 我想到了第二个特性,它继承自,并提供作为该特性的默认实现,如下所示: 这不起作用,因为Rust中的特征继承意味着两个特征都需要实现,因此它不会让我在的和实现中键入相同的代码。

  • 问题内容: 我正在尝试使用hibernate多租户(从第16章开始)。 现在,我的 ExtendedStorageManager 使用此方法启动多租户会话: 很显然,我在测试时,因为我完全错过了执行了第一个错误 MultiTenantConnectionProvider 作为解释在这里。 使用grepcode,我发现了AbstractMultiTenantConnectionProvider,它看

  • 本文向大家介绍写一个NSString类的实现相关面试题,主要包含被问及写一个NSString类的实现时的应答技巧和注意事项,需要的朋友参考一下