当前位置:  开发笔记 > 编程语言 > 正文

为什么添加第二个impl可以防止对参数进行反引用强制转换?

如何解决《为什么添加第二个impl可以防止对参数进行反引用强制转换?》经验,为你挑选了0个好方法。

尝试将impl添加Add for String到标准库时遇到了这个问题。但是我们可以轻松地复制它,而无需操作员恶作剧。我们从这个开始:

trait MyAdd {
    fn add(self, rhs: Rhs) -> Self;
}

impl MyAdd<&str> for String {
    fn add(mut self, rhs: &str) -> Self {
        self.push_str(rhs);
        self
    }
}

很简单。这样,将编译以下代码:

let a = String::from("a");
let b = String::from("b");
MyAdd::add(a, &b);

请注意,在这种情况下,第二个参数表达式(&b)具有类型&String。然后将其反强制执行&str,然后函数调用起作用。

但是,让我们尝试添加以下内容:

impl MyAdd for String {
    fn add(mut self, rhs: char) -> Self {
        self.push(rhs);
        self
    }
}

(操场上的一切)

现在,MyAdd::add(a, &b)上面的表达式导致以下错误:

error[E0277]: the trait bound `std::string::String: MyAdd<&std::string::String>` is not satisfied
  --> src/main.rs:24:5
   |
2  |     fn add(self, rhs: Rhs) -> Self;
   |     ------------------------------- required by `MyAdd::add`
...
24 |     MyAdd::add(a, &b);
   |     ^^^^^^^^^^ the trait `MyAdd<&std::string::String>` is not implemented for `std::string::String`
   |
   = help: the following implementations were found:
             >
             >

这是为什么?对我来说,似乎只有在只有一个候选函数时才执行反强制。但这对我来说似乎是错误的。为什么规则会这样?我尝试浏览该规范,但在参数deref强制上未找到任何内容。

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有