为什么 deref 强制不适用于“From::from”?

Why does deref coercion not work with `From::from`?

提问人:jsstuball 提问时间:12/11/2022 更新时间:12/12/2022 访问量:54

问:

从书中的部分

Deref 强制将对实现特征的类型的引用转换为对另一种类型的引用。它会自动发生 当我们将对特定类型值的引用作为参数传递时 添加到与 函数或方法定义。Deref

我正在尝试弄清楚以下代码中 和 之间的区别,这意味着一个编译而另一个不编译。barFrom::from

struct T;
struct U;
struct W;

impl From<&U> for T {
    fn from(u: &U) -> T { T }
}

impl std::ops::Deref for W {
    type Target = U;
    fn deref(&self) -> &U {
       &U 
    }
}

fn foo(_: T) {}
fn bar(_: &U) {}

fn main() {
   let w = &W; 
   foo(T::from(w)); // error. "trait bound `T: From<&W>` not satisfied"
//   bar(w); // okay
}

如果我显式键入 .但我没想到必须这样做。即使有多个实现,一个类型也只能变成一个类型,所以编译器不是只有一个选项吗,尝试取消传递的类型,然后查看目标的实现是否存在?From::<&U>::from(w)FromTderef()From

rust typeerror 取消引用

评论


答:

1赞 cafce25 12/12/2022 #1

不同之处在于,它是一个具体的函数,而不是,它是该特征的任何实现之一。编译器首先必须找到正确的实现。但它发现这没有实现。然后它放弃了。barT::fromFrom<&U>

这里甚至没有 deref 强制的 attept,因为编译器这样做的情况都不适用于这里。

我们还没有函数⇒没有目标类型⇒我们无法“匹配函数或方法定义中的参数类型”。