来自section在书里:
Deref 强制转换将引用转换为实现Deref
特征转换为对另一种类型的引用。它会自动发生
当我们传递对特定类型值的引用作为参数时
与参数类型不匹配的函数或方法
函数或方法定义。
我正在尝试找出两者之间的区别bar
and From::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)
。但我没想到必须这样做。即使有多个From
的实现T
,一个类型只能deref()
转换为一种类型,因此编译器是否只有一个选项,尝试并取消引用传递的类型,然后查看是否From
目标是否存在实施?
不同之处在于bar
是一个具体函数,而T::from
不是,它是该特征的任何实现之一。编译器首先必须找到正确的实现。但它发现From<&U>
没有实施。然后它就放弃了。
这里甚至没有尝试取消引用强制转换,因为编译器这样做的情况都不适用。
我们还没有函数⇒我们没有目标类型⇒我们无法“匹配函数或方法定义中的参数类型”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)