为什么我不能在具有类型参数的特征上添加一揽子实现?

2024-01-11

考虑这两个特征:

pub trait Foo {
    fn new(arg: u32) -> Self;
}

pub trait Bar<P>: Foo {
    fn with_parameter(arg: u32, parameter: P) -> Self;
}

我想添加毯子暗示:

impl<T: Bar<P>, P: Default> Foo for T {
    fn new(arg: u32) -> Self {
        Self::with_parameter(arg, P::default())
    }
}

但我收到编译器错误:

error[E0207]: the type parameter `P` is not constrained by the impl trait, self type, or predicates
 --> src/lib.rs:9:17
  |
9 | impl<T: Bar<P>, P: Default> Foo for T {
  |                 ^ unconstrained type parameter

我认为我得到这个错误是因为我违反了特质一致性规则,但我不明白这会打破什么规则。为什么不允许这种模式?而且,更重要的是,我能否在不出现错误的情况下实现我想要的目标?


问题是单一类型可以实现Bar<P>对于多个值P。如果你有一个结构Baz实施的Bar<i32> and Bar<String>,哪种类型应该Foo::new用于P?

唯一的解决方案是确保单一类型不能实现Bar不止一次(如果这不是您想要的,那么您的设计就有缺陷!)。为此,我们必须更换P具有关联类型的类型参数。

pub trait Bar: Foo {
    type Parameter;

    fn with_parameter(arg: u32, parameter: Self::Parameter) -> Self;
}

impl<T> Foo for T
where
    T: Bar,
    T::Parameter: Default,
{
    fn new(arg: u32) -> Self {
        Self::with_parameter(arg, T::Parameter::default())
    }
}

一个实现Bar看起来像这样:

struct Baz;

impl Bar for Baz {
    type Parameter = i32;

    fn with_parameter(arg: u32, parameter: Self::Parameter) -> Self {
        unimplemented!()
    }
}

也可以看看:

  • 为什么在为闭包特征 (Fn) 创建总体实现时会出现“类型参数不受约束”? https://stackoverflow.com/q/37377490/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能在具有类型参数的特征上添加一揽子实现? 的相关文章

随机推荐

  • 双指针转换,传递给带有 `const void **ptr` 参数的函数

    GCC 给我以下警告 note expected const void but argument is of type const struct auth 有没有什么情况可能会导致问题 更大的片段是 struct auth current
  • 停止表单输入框自动完成的正确方法是什么?

    我有一个表单 其中包含附加到一个 JQUERY 日期选择器
  • Spring Data MongoDB 4.0 事务支持

    MongoDB 4 0即将推出交易 https www mongodb com transactions支持 ACID 保证 Spring Data MongoDB 是否已经支持 MongoDB 中的事务 如果不支持 这个很棒的功能何时可用
  • Django Rest Framework - 有效地检索反向外键的相关字段

    我有以下代表用户工作组的模型 每个工作组均设一名组长和成员 class WorkingGroup models Model group name models CharField max length 255 leader models F
  • 手动编组到线程

    在 WinForms 中 您有Control BeginInvoke 这意味着您可以将后台线程的调用编组到创建控件句柄的主 UI 线程 这很好 但是 在 C 中 如何在两个 标准 线程之间执行此操作 我编写了一个服务总线 它有一个处理器线程
  • 显示从 Jscript 运行的 shell 命令的输出

    我想在 Windows 计算机上从 IE 中的 jscript 运行 shell 命令 我有以下 jscript 函数 function execCommand command var myShell new ActiveXObject W
  • Brunch 需要使用 Node.js 模块

    我设置了 Brunch 以便于一起编译 JS 但也希望能够将 node js 模块与 require 一起使用 尝试了一段时间后 我被难住了 我希望能够做这样的事情 var myJSfile1 require foo var myJSfil
  • 带有 Active Directory PartialResultException 的 JNDI

    我基本上是在 Active Directory 中遍历 LDAP 树 在我查询的每个级别 objectClass 当我在根上执行此操作时 例如 dc example dc com 我得到下面的异常 这在我们的其他 LDAP 实例上运行良好
  • 如何使用 C# 4.0 检测 Windows 8 操作系统?

    我必须在我的 C Windows 应用程序中检测 Windows 8 操作系统并进行一些设置 我知道我们可以使用以下命令检测 Windows 7Environment OSVersion 但是如何检测Windows 8呢 提前致谢 Vers
  • SQL查询和Unicode问题

    我对 unicode 数据的 Sql 查询有一个非常奇怪的问题 这是我所得到的 SQL Server Express 2008 R2 AS 包含汉字 单词 短语的表 100 000行 当我运行以下命令时 我得到了正确的行 返回的 36 个其
  • Delphi中绝对路径和相对路径的转换

    Delphi中有执行绝对相对路径转换的标准函数吗 例如 基本 路径是 C Projects Project1 相对路径是 Shared somefile pas 绝对路径是 C Projects Shared somefile pas 我正
  • IntelliJ 缩短 Cucumber 测试的命令行 [重复]

    这个问题在这里已经有答案了 我在 IntelliJ 中运行 Cucumber 测试时遇到问题 当我尝试运行功能或场景时 出现以下错误 Error running Feature
  • 列名作为 INSERT 语句中的参数

    我想创建一个存储过程我想在表中插入值的地方 但我不知道我必须在哪个字段中插入值以及在运行时我将决定应将值插入哪个字段 我想做的是 insert into Tablename ColumnName Description values Col
  • 如何实现可写流

    我想将数据从 amazon kinesis 流传输到 s3 日志或 Bunyan 日志 该示例使用文件写入流或标准输出 我将如何实现我自己的可写流 this works var file fs createWriteStream my lo
  • 以编程方式更改 Google 翻译下拉菜单

    在一个网站上 我尝试使用以下代码添加谷歌翻译下拉列表 function googleTranslateElementInit new google translate TranslateElement pageLanguage en goo
  • Facebook“点赞按钮”返回 X-Frame-Options Deny

    我正在尝试在博客的每篇文章上添加一个 Facebook 的 点赞按钮 代码粘贴正确 但我收到此错误 Refused to display https www facebook com undefined plugins like php a
  • 用于 32 位 x86 汇编的 DOS 调试程序

    你们中的许多人可能还记得古老的 DOS 程序 debug 尽管它在很多方面都已经过时 但它的好处之一是 人们可以轻松地找到给定指令的字节序列 而无需经历编写程序 编译 反汇编 检查文件内容等步骤 输入指令 然后转储指令地址 遗憾的是 调试
  • 滚动直到元素可见 iOS UI Automation with Xcode 7

    因此 通过新的 Xcode 更新 Apple 改变了我们进行 UI 测试的方式 在工具中 我们使用java脚本函数 isVisible 来确定我们的目标元素是否可见 我正在尝试在 Objective C 中复制它 但我似乎找不到与之等效的东
  • 管道中的控制台输出:Jenkins

    我创建了一个复杂的管道 在每个阶段我都称之为工作 我想查看 Jenkins 某个阶段中每个作业的控制台输出 如何获得 从构建步骤返回的对象可用于查询日志 如下所示 pipeline agent any stages stage test s
  • 为什么我不能在具有类型参数的特征上添加一揽子实现?

    考虑这两个特征 pub trait Foo fn new arg u32 gt Self pub trait Bar p Foo fn with parameter arg u32 parameter P gt Self 我想添加毯子暗示