gpt4 book ai didi

types - 所有特征对象的默认特征方法实现

转载 作者:行者123 更新时间:2023-11-29 08:15:59 25 4
gpt4 key购买 nike

我有一个特征 MyTrait,我希望所有特征对象 &MyTrait 都可以相互比较,而不能与其他任何东西进行比较。我现在有那个基于 How to test for equality between trait objects? .

问题是我需要到处使用MyTraitComparable,而不是MyTrait。有办法解决这个问题吗?

use std::any::Any;

trait MyTrait {}

trait MyTraitComparable: MyTrait {
fn as_any(&self) -> &Any;

fn equals(&self, other: &MyTraitComparable) -> bool;
}

impl<S: 'static + MyTrait + PartialEq> MyTraitComparable for S {
fn as_any(&self) -> &Any {
return self as &Any;
}

fn equals(&self, other: &MyTraitComparable) -> bool {
return match other.as_any().downcast_ref::<S>() {
None => false,
Some(a) => self == a,
};
}
}

#[derive(PartialEq)]
struct MyObj {
a: i32,
}
impl MyObj {
fn new(a: i32) -> MyObj {
return MyObj { a };
}
}

impl MyTrait for MyObj {}

fn main() {
assert!(as_trait_obj_and_compare(&MyObj::new(1), &MyObj::new(1)));
}

fn as_trait_obj_and_compare(obj: &MyTraitComparable, another_obj: &MyTraitComparable) -> bool {
obj.equals(another_obj)
}

我尝试将 as_anyequals 移动到 MyTrait 并提供默认实现,但是

  • 我不认为在那种情况下我可以使用 self,所以它不起作用。
  • 如果我使用 trait MyTrait: PartialEq 那么我就不能再创建特征对象了。

最佳答案

如果您愿意使用夜间编译器和不稳定的功能,您可以使用 specialization避免有两个特征:

#![feature(specialization)]

use std::any::Any;

trait MyTrait {
fn as_any(&self) -> &Any;
fn equals(&self, other: &MyTrait) -> bool;
}

default impl<S: 'static + PartialEq> MyTrait for S {
default fn as_any(&self) -> &Any {
return self as &Any;
}

default fn equals(&self, other: &MyTrait) -> bool {
match other.as_any().downcast_ref::<S>() {
None => false,
Some(a) => self == a,
}
}
}

#[derive(PartialEq)]
struct MyObj {
a: i32,
}
impl MyObj {
fn new(a: i32) -> MyObj {
return MyObj { a };
}
}

impl MyTrait for MyObj {}

fn main() {
assert!(as_trait_obj_and_compare(&MyObj::new(1), &MyObj::new(1)));
}

fn as_trait_obj_and_compare(obj: &MyTrait, another_obj: &MyTrait) -> bool {
obj.equals(another_obj)
}

关于types - 所有特征对象的默认特征方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49466199/

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