gpt4 book ai didi

rust - supertrait 的默认实现

转载 作者:行者123 更新时间:2023-12-03 11:30:04 25 4
gpt4 key购买 nike

我有一个特质,MyGoodTrait , 功能 label(&self) -> &str .我想要 MyGoodTrait 的每个实现者也实现 DisplayFromStr .但是,我不一定需要DisplayFromStr成为MyGoodTrait的超能力.我宁愿以某种方式默认实现 DisplayFromStr ,这将在内部使用 label函数来自 MyGoodTrait .这样,MyGoodTrait 的每个实现者将得到 DisplayFromStr “免费”,就好像这些特征有默认实现一样。

这是一个类似于我想要做的示例,但它无法编译:

use std::str::FromStr;

pub trait MyGoodTrait {
fn new() -> Self;

fn label(&self) -> &'static str;
}

impl FromStr for dyn MyGoodTrait {
type Err = String;

fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self::new())
}
}

pub struct A {}

impl MyGoodTrait for A {

fn new() -> Self {
A{}
}
fn label(&self) -> &'static str {
"A"
}
}

pub struct B {}

impl MyGoodTrait for B {

fn new() -> Self {
B{}
}
fn label(&self) -> &'static str {
"B"
}
}

// In this hypothetical, A and B now both have `fmt` and `from_str` functions

有没有办法编写 Display 的默认实现?和 FromStr ,这样我就不必为每个实现 MyGoodTrait 的结构复制代码?

注意:我的实际用例是我有一个特征,它具有 serde::se::Serializeserde::de::Deserialize作为超能力。我的 trait 的实现者将用作映射中的键,我会将映射序列化为 JSON,因此我需要将实现者序列化为字符串。所以这可能是 XY Problem 的一个例子

最佳答案

TL; DR:你不能。

您无法实现 FromStrdyn SomeTrait因为它有一个返回 Result<Self, _> 的方法,因此您只能为编译时已知大小的类型实现它,而特征对象则不然。

你真正想要的是

impl<T: MyGoodTrait> FromStr for T

但现在你可能违反了孤儿规则。正如编译器所解释的:

Implementing a foreign trait is only possible if at least one of the types for which is it implemented is local. Only traits defined in the current crate can be implemented for a type parameter.



但是如果 FromStr你可以做到而是一个地方特征:
/// Copy of `std::str::FromStr`
trait Foo: Sized {
type Err;

fn from_str(s: &str) -> Result<Self, Self::Err>;
}

impl<T: MyGoodTrait> Foo for T {
type Err = String;

fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self::new())
}
}

或者您可以为任何特定的本地类型实现它:
impl FromStr for A {
type Err = String;

fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self::new())
}
}

关于rust - supertrait 的默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61108590/

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