gpt4 book ai didi

rust - 如何为参数化特征实现特征

转载 作者:行者123 更新时间:2023-11-29 07:45:47 26 4
gpt4 key购买 nike

我有一个设计问题,当使用像这样的东西时:

trait MyTrait<K: OtherTrait> { ... }

impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }

由于 E207 错误(“类型参数 K 不受 impl 特征、自身类型或谓词约束”,我无法为此特征实现特征)。

找不到消除此错误的方法,我申请了 this not-so-good-looking workaround (没有内在值(value)的冗长结构):

use std::fmt;
use std::marker::PhantomData;

pub trait MyTrait<K: fmt::Display> {
fn get_some_k(&self) -> Option<K>;
}

/* // This is my target impl but results in E207 due to K not constrained
impl<K: fmt::Display, S: MyTrait<K>> fmt::Display for S {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.get_some_k().unwrap())
}
} */
pub struct Ugly<'a, K: fmt::Display, S: 'a + MyTrait<K>>(&'a S, PhantomData<K>);
impl<'a, K: fmt::Display, S: MyTrait<K>> fmt::Display for Ugly<'a, K, S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0.get_some_k().unwrap())
}
}

fn main() { }

我认为应该有一些更好的方法来为这种参数化特征实现特征。

我没有在 std 中找到很好的示例(例如,在具有关联类型(如 Iterator)的特征中没有 Display 实现)?

最佳答案

Here’s an implementation using associated types (这意味着您只能为每种类型的一个 MyTrait 实现 K):

use std::fmt;

pub trait MyTrait {
type K: fmt::Display;
fn get_some_k(&self) -> Option<Self::K>;
}

impl<S: MyTrait> fmt::Display for S {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.get_some_k().unwrap())
}
}

fn main() { }

但是,当像这样澄清时,很明显这种方法也行不通,因为您正在实现 Display对于所有实现 MyTrait 的类型—可以拥有自己的类型 Display执行。这是被禁止的,所以你得到 E0210:

error: type parameter S must be used as the type parameter for some local type (e.g. MyStruct<T>); only traits defined in the current crate can be implemented for a type parameter [E0210]

用某种东西包裹它——比如你的 Ugly did——是允许这种实现的唯一方法。或者在你自己的 crate 中而不是在别人的 crate 中实现一个特征(比如 Display 是)。

关于rust - 如何为参数化特征实现特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30440474/

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