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

如何实现参数化特征的特征

楮法
2023-03-14

我有一个设计问题,当使用类似的东西时:

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

impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }
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的关联类型的traits中没有display实现)?

共有1个答案

上官高逸
2023-03-14

下面是一个使用关联类型的实现(这意味着每个类型只能为一个K实现MyTrait):

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() { }

但是,如果这样说明,就会清楚地看出这种方法也行不通,因为您要为实现MyTrait的所有类型实现Display--这些类型可能有自己的Display实现。这是禁止的,因此您得到E0210:

错误:类型参数s必须用作某些本地类型的类型参数(例如mystruct );只有在当前板条箱中定义的特征才能为类型参数实现[E0210]

将其包装成某种东西--就像您的ughlydid那样--是允许这种实现的唯一方法。或者在自己的板条箱中实现一个特征,而不是在其他人的板条箱中实现一个特征(如displayis)。

 类似资料:
  • 是否可以将特征作为参数传递给这样的泛型函数? 这会产生以下错误: 也就是说,是否可以接受一个trait作为泛型参数,以便它可以返回该trait的iterable?我一直在寻找答案,但现在我觉得我可能问错了问题。 背景是这样的。我有一个结构,有几个不同具体类型的向量,它们都实现了相同的特性。我希望结构的impl有一个函数,可以返回所有存储对象上的iterable作为它们的任何共同特征。上面的是该(概

  • 我有一个这样的提供程序设置: 我正在尝试使用actix web中的内置方法,将 或类似的东西。 但是,我反而收到以下错误: 有人能帮我弄清楚怎么解决这个问题吗?我对std::marker::size做了一些研究,但我不知道如何使用它来解决这个问题。

  • 我在和Rust玩,这是代码: 我收到错误消息: 在struct<code>filter::ContentFilter</code>中找到的预期特征对象<code>dyn filter::TFilter</code> =注意:预期引用<代码> 这是误导性的: 它确实实现了该特征 编译器知道 结构的大小 有线索吗? 另外,代码无论如何都不好(因为不清楚返回的盒子是谁的),但信息是误导性的。 缴费灵。那

  • 我试图在生锈中编写一些通用的数学函数,我一直遇到以下错误消息: 有可能解决这个问题吗?如果是,怎么做? 例如,我正在尝试编写一个通用的点积,它使用两个迭代器,对它们进行压缩,并对这些迭代器对进行迭代,以累积积。我希望这个函数也能计算复数点积。复数上的点积包括共轭一面。我的第一个想法是为一个二进制函数编写一个trait,以替换,因为它还与左侧参数共轭。以下是完整的代码: 因为一个

  • 问题内容: 我想知道如何在数据库中最好地实现“ 观看次数最多 ”的功能(例如youtube)。 让我来解释一下“ 最多观看 ”功能更好一点: 基本上,我想列出从这天/周/月访问最多的网页/视频/等,见 http://www.youtube.com/charts/videos_views为一个例子。 因此,我想知道如何最好地实现此功能,因为我可以想到许多实现此功能的方法,但是所有方法都具有+和-的含

  • 将跟踪和跨度添加到Slf4J MDC,以便您可以从日志聚合器中的给定跟踪或跨度中提取所有日志。示例日志: 2016-02-02 15:30:57.902 INFO [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ... 2016-02-02 15:30:58.372 ERROR [bar,6bfd