如果“&String”没有实现“Into”,为什么这些实现会发生冲突?

2023-11-24

我问了一个相关问题关于为什么没有实施From<&String> for String。我现在想创建自己的特质,如下所示:

#[derive(Debug)]
struct MyStruct(String);

impl MyStruct {
    fn new<T>(t: T) -> MyStruct
    where
        T: MyIntoString,
    {
        MyStruct(t.my_into())
    }
}

trait MyIntoString {
    fn my_into(self) -> String;
}

impl<'a> MyIntoString for &'a String {
    fn my_into(self) -> String {
        self.clone()
    }
}

impl<I> MyIntoString for I
where
    I: Into<String>,
{
    fn my_into(self) -> String {
        self.into()
    }
}

fn main() {
    let s: String = "Hello world!".into();
    let st: MyStruct = MyStruct::new(&s);
    println!("{:?}", st);
}

编译器现在声称这两个实现MyIntoString是矛盾的。这对我来说更奇怪,因为我们已经在另一个问题中看到了From<&String>没有实施String所以它没有找到一个实现Into<String> for &String。那么现在怎么会出现矛盾呢?

此外,即使我打开#![feature(specialization)],检测到相同的冲突。

错误信息

根据这个问题的一个答案,看起来错误消息没有引导我走上正确的轨道。

因此,让我发布错误消息来归咎于它,因为它将来可能会改变。

error[E0119]: conflicting implementations of trait `MyIntoString` for type `&std::string::String`:
  --> src/main.rs:23:1
   |
17 | / impl<'a> MyIntoString for &'a String {
18 | |     fn my_into(self) -> String {
19 | |         self.clone()
20 | |     }
21 | | }
   | |_- first implementation here
22 |   
23 | / impl<I> MyIntoString for I
24 | | where
25 | |     I: Into<String>,
26 | | {
...  |
29 | |     }
30 | | }
   | |_^ conflicting implementation for `&std::string::String`

对我来说,这是编译器声称存在真正的冲突,而不是潜在的冲突。


该错误是由孤儿规则引起的(请参阅本书第二版第 10.2 章末尾)在类型上实现特征).

这些可以防止您的代码在发生微小更改时被破坏(根据RFC#1105)在您使用的板条箱中。如果标准库的作者决定实现Into<String> for &String,那么你的程序将包含一个相互冲突的定义my_into并会破裂。添加特征实现应该是一个小的改变,并且不应该破坏你的程序。

这个帖子为规则提供理由。

本书建议使用新类型模式解决这个问题。

#[derive(Debug)]
struct MyStruct(String);

impl MyStruct {
    fn new<T>(t: T) -> MyStruct
    where
        T: Into<String>,
    {
        MyStruct(t.into())
    }
}

struct Wrapper<'a>(&'a String);

impl<'a> From<Wrapper<'a>> for String  {
    fn from(t: Wrapper<'a>) -> String {
        t.0.clone()
    }
}

fn main() {
    let s: String = "Hello world!".into();
    let st: MyStruct = MyStruct::new(Wrapper(&s));
    println!("{:?}", st);
}

游乐场链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果“&String”没有实现“Into”,为什么这些实现会发生冲突? 的相关文章

随机推荐

  • 如何在格子中标记面板

    这是一个简单的问题 您肯定已经遇到过 但让我很头疼 我有一个像这样的数据框 set seed 3 mydata lt data frame var rnorm 100 20 1 temp sin sort rep c 1 10 10 sub
  • 评估业务规则引擎的标准[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我们正在购买业务规则引擎
  • Jquery 选择元素 2 的位置进一步 - .next().next() 的另一种方式

    我正在寻找一种方法 如何选择一个 div 元素 该元素不是通过单击功能 选择 的元素的直接下一个元素 div siblings div div text div div div 现在我想选择 id 为 get this one 的一个 在我
  • Git 如何记录(或更可能表示)其 blob 的文件路径和名称,然后识别重命名?

    我正在尝试了解 git 设法 记住 文件名及其路径的方式 因为它只将文件内容存储在 blob 中 解释是在链接在这里Abizem 写的不错吗 这是迄今为止我见过的最好的 后续问题是 git 如何 在哪里 确定我们何时具有相似性 特别是在 移
  • Python 等价于 vector::reserve()

    我正在寻找 C vector reserve 的 Python 等效项 我不知道列表会提前有多大 但我知道它会相当大 并且我希望尽可能避免调整大小 因为列表是在深层内部循环中增长的 到目前为止 我提出的唯一解决方案与 vector rese
  • 将映射值复制到 STL 中的向量[重复]

    这个问题在这里已经有答案了 目前正在努力学习Effective STL 第 5 条建议使用范围成员函数通常比使用单元素函数更可取 我目前希望将映射中的所有值 即 我不需要键 复制到向量中 最干净的方法是什么 你可能可以使用std trans
  • __stdcall的含义和用法是什么?

    我遇到过 stdcall这些天很多 MSDN 没有非常清楚地解释它的真正含义 何时以及为什么应该使用它 如果有的话 如果有人能提供解释 最好是举一两个例子 我将不胜感激 这个答案涵盖了 32 位模式 Windows x64 仅使用 2 个约
  • 在 JDBC 中处理 DATETIME 值 0000-00-00 00:00:00

    如果我尝试这样做 我会得到一个例外 见下文 resultset getString add date 对于包含 DATETIME 值 0000 00 00 00 00 00 DATETIME 的准空值 的 MySQL 数据库的 JDBC 连
  • 有效地查找大集合中具有低汉明距离的二进制字符串

    Problem 给定一个大 约 1 亿 无符号 32 位整数列表 一个无符号 32 位整数输入值和最大汉明距离 返回输入值的指定汉明距离内的所有列表成员 保存列表的实际数据结构是开放的 性能要求决定了内存中的解决方案 构建数据结构的成本是次
  • 在节目中跳入 Python 交互式会话?

    嘿 我想知道 我正在将 pydev 与 eclipse 一起使用 我真的很喜欢强大的调试功能 但我想知道 是否可以在eclipse中设置断点并在执行过程中跳转到交互式python解释器 我认为这会非常方便 edit 我想强调 我的目标不是跳
  • Symfony 2 注销(UserInterface::eraseCredentials)

    我想eraseCredentials是用来注销的吗 如果是这样 我如何清除教义实体的会话 No eraseCredentials 用于在持久化令牌之前擦除敏感数据 无论是序列化还是数据库 要以编程方式注销用户 您可以使用以下命令 this
  • JavaMail检查邮件内容 gmail IMAP

    我正在尝试阅读我的消息 我可以让它打印标题 但发件人和内容显示得很有趣 这是我用来显示消息的代码 int j message length 1 for int i j i gt 0 i System out println Message
  • 有什么方法可以知道流星订阅何时“有效”?

    如果我改变一个Sessionvar 并通过以下方式触发重新订阅autosubscribe 是否有任何回调机制可以等待 最新 数据从服务器上下来 1 如果你看一下这个要点您将看到一些代码 这些代码随着订阅的变化而记录集合的内容 输出的相关部分
  • 计算字符串在字符串中出现的次数[重复]

    这个问题在这里已经有答案了 我只是有一个看起来像这样的字符串 7 真 NA 假 67 假 NA 假 5 假 NA 假 5 假 NA 假 我想做的就是计算字符串出现了多少次 true 出现在该字符串中 我感觉答案是这样的String Coun
  • Python - 如何使用模块的别名来导入其子模块?

    我的模块名称很长 我想避免在文档中多次输入它 我可以简单地做import long ass module name as lamn并这样称呼它 但是 该模块有许多我也希望导入和使用的子模块 在这种情况下我将无法写import lamn su
  • max() 函数如何处理 python 中的字符串列表?

    我有一个清单 list1 123 xyz zara abc print Max value element max list1 它给 Max value element zara 另请解释它如何对字符串列表和数字列表进行比较 This is
  • 使用 ExcelDataReader 和 Epplus 访问受保护的 Excel 文件

    标题几乎说明了一切 寻找一种使用 ExcelDataReader 和 Epplus 访问受密码保护的 Excel 文件的方法 找不到正确的答案 如果使用 ExcelDataReader 我的代码如下所示 excelStream File O
  • 如何在 SOLR 中索引文档?

    我在 Ubuntu 10 04 上运行 Solr 1 4 通过 apt get solr tomcat 安装 它似乎工作正常 不过 我很难找到有关如何索引文档的任何连贯信息 我是 SOLR 新手 所以请耐心等待 我有一个已安装的 Windo
  • 天蓝色资源管理器服务总线提供商?

    有 ServiceBus 提供商这样的东西吗 作为我的应用程序的一部分 我想包含 SB 命名空间 主题和订阅 您是否期望使用 ARM 部署网站 并使用服务接口来编写其他支持功能的脚本 现在有一个服务总线提供商 样本模板 apiVersion
  • 如果“&String”没有实现“Into”,为什么这些实现会发生冲突?

    我问了一个相关问题关于为什么没有实施From lt String gt for String 我现在想创建自己的特质 如下所示 derive Debug struct MyStruct String impl MyStruct fn new