我可以避免使用泛型来避免急于解决特征实现的歧义吗?

2024-06-19

考虑以下 Rust 代码 []:

use std::collections::HashMap;
use std::hash::Hash;

trait Foo<K> {
    const FOO: i32;
}

impl<K, K_, V> Foo<HashMap<K_, V>> for HashMap<K, V>
where
    K: Hash + Eq + Into<K_>,
{
    const FOO: i32 = 1;
}

impl<K, V, V_> Foo<HashMap<K, V_>> for HashMap<K, V>
where
    K: Hash + Eq,
    V: Into<V_>,
{
    const FOO: i32 = 2;
}

fn main() {}

(The const不相关,我想要编译代码fns too).

它无法编译并出现错误:

error[E0119]: conflicting implementations of trait `Foo<std::collections::HashMap<_, _>>` for type `std::collections::HashMap<_, _>`:
  --> src/main.rs:15:1
   |
8  | / impl<K, K_, V> Foo<HashMap<K_, V>> for HashMap<K, V>
9  | | where
10 | |     K: Hash + Eq + Into<K_>,
11 | | {
12 | |     const FOO: i32 = 1;
13 | | }
   | |_- first implementation here
14 | 
15 | / impl<K, V, V_> Foo<HashMap<K, V_>> for HashMap<K, V>
16 | | where
17 | |     K: Hash + Eq,
18 | |     V: Into<V_>,
19 | | {
20 | |     const FOO: i32 = 2;
21 | | }
   | |_^ conflicting implementation for `std::collections::HashMap<_, _>`

据我了解,问题在于这里存在歧义 - 应该选择哪个实现if两者都合法吗?理想情况下,我希望拥有以下内容:

  1. 上面的代码(或一些解决方法)应该可以正常编译。
  2. 在调用站点,如果只有一个impl对于给定的类型可能存在,然后选择该类型。
  3. 在调用站点,如果有多个impl如果有可能,那么它就是一个错误(连贯性问题)。

更简洁地说,我希望在调用站点而不是在定义站点完成歧义解决。有可能有这种行为吗?


我可以避免使用泛型来避免急于解决特征实现的歧义吗?

No.

是否可以[在调用站点而不是在定义站点完成歧义解决]?

No.


有一个(拖延已久的)RFC for 专业化 https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md这将允许重叠的特征实现,但前提是其中一个特征比其他特征更具体。我不认为这对你的情况是正确的,所以它没有帮助。

也可以看看:

  • Rust 中特征的实现冲突 https://stackoverflow.com/q/39159226/155423
  • 为什么对于未实现 Ord 的 f32,我会得到“trait 的冲突实现”? https://stackoverflow.com/q/45033704/155423
  • 为什么在专门化特征时会出现冲突实现错误? https://stackoverflow.com/q/45873736/155423
  • 使用泛型类型时,“From”的实现如何会发生冲突? https://stackoverflow.com/q/37347311/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以避免使用泛型来避免急于解决特征实现的歧义吗? 的相关文章

随机推荐

  • 了解 Python 2.7 中的缩进错误

    在编写 python 代码时 我往往会遇到很多缩进错误 有时 当我删除并重写该行时 错误就会消失 有人可以为菜鸟提供 python 中 IndentationErrors 的高级解释吗 以下是我在玩 CheckIO 时收到的最近 inden
  • Django User 模型,添加功能

    我想向 Django 的默认用户模型添加一个新函数 用于检索模型类型的相关列表 这样的 Foo 模型 class Foo models Model owner models ForeignKey User related name owne
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • 以编程方式设置 Logback Appender 路径

    我正在尝试以编程方式设置 Logback 附加程序路径 滚动文件附加器 http logback qos ch apidocs ch qos logback core rolling RollingFileAppender html准确地说
  • Kotlin Room 数据库单例模式

    我正在尝试创建单人房间数据库 我找到了两种解决方案 但我不知道它们之间有什么区别 根据这个文件 companion object Volatile private var INSTANCE AppDatabase null fun getI
  • 对 HTTP 处理程序的同时请求不起作用

    我的 ASP Net 应用程序中有一个通用 HTTP 处理程序 ashx 它执行一些基本但耗时的计算 将进度语句打印到输出 以便让用户了解情况 执行这些计算涉及读取一些在使用处理程序时锁定的数据文件 因此对处理程序的两次调用不要立即开始处理
  • 无法通过 Android 应用程序访问我的笔记本电脑的本地主机

    因此 我在发布此内容之前做了一项研究 我发现的解决方案不起作用 更准确地说 连接到我的笔记本电脑的 IPv4192 168 XXX XXX 没用 连接到10 0 2 2 加上端口 不起作用 我需要测试使用 Django Rest 框架构建的
  • 如何使用 LazyColumn animateItemPlacement() 而不自动滚动更改?

    我正在使用一个LazyColumn以类似清单的方式 该列表首先显示所有待完成的项目 最后显示所有已完成的项目 点击一个项目可以切换它是否完成 这是我正在做的 MWE data class TodoItem val id Int val la
  • 慢速自动增量重置

    我有很多表 由于某些原因 我需要在应用程序启动时调整这些表的自动增量值 我尝试这样做 mysql gt select max id from item max id 97972232 1 row in set 0 05 sec mysql
  • Django TastyPie 地理距离查找

    我正在使用 TastyPie 进行地理距离查找 这有点困难 因为 TastyPie 官方不支持它 在 Github https gist github com 1067176 上我找到了以下代码示例 def apply sorting se
  • 如何从 python 脚本执行 7zip 命令

    我试图了解如何使用 os system 模块来执行 7zip 命令 现在我不想用 Popen 或 subprocess 让事情变得复杂 我已经安装了 7zip 并将 7zip exe 复制到我的用户文件夹中 我只想提取我的测试文件 inst
  • Pandas 字典键到列[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 index column1 e1 u c680 5 u c681 1 u c682 2 u c57 e2 u c680 6 u c681 2 u c682 1 u c57 e3 u c68
  • 如何在提交表单之前删除自动数字格式?

    我正在使用 jQuery 插件自动数字 http www decorplanit com plugin 但是当我提交表单时 我无法删除之前字段上的格式POST 我尝试使用 input autonumeric destroy 和其他方法 但它
  • 卸载/销毁 Angular 延迟加载组件

    我的设置与此处找到的帖子类似http ify io lazy loading in angularjs http ify io lazy loading in angularjs 处理 Angular 中我的应用程序的各种组件的延迟加载 我
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 如何在 Vue 2 中使用 Vue 路由器

    我正在学习 Vue 并开始于网页包模板 https github com vuejs templates webpack tree master template src 我想做的第一件事是添加对 Vue Router 的支持 但我现在已经
  • @NonCPS 在 Jenkins 管道脚本中的作用是什么

    我在詹金斯中有一个管道脚本 我曾经遇到过这个异常 org jenkinsci plugins scriptsecurity sandbox RejectedAccessException 不允许脚本使用 groovy json JsonSl
  • BigQuery 如何获取 JSON 结构中的值的总和?

    我有以下查询 SELECT JSON EXTRACT json Weights as weight from select Weights blue 1 0 purple 0 0 yellow 1 0 green 1 0 as json 返
  • 我可以避免使用泛型来避免急于解决特征实现的歧义吗?

    考虑以下 Rust 代码 use std collections HashMap use std hash Hash trait Foo