【发布时间】:2015-03-26 12:52:24
【问题描述】:
我在我的代码中使用了新的通用转换特征,并且体验到人体工程学的减少。如您在示例中所见,有问题的代码实现了AsRef<str> for [Ascii]。
现在我想在assert_eq!() 中使用v.as_ref() 并期望v.as_ref() 使用提供的实现返回&str,因为assert_eq!() 的第二个参数是&str 类型。
没有AsRef<String> for [Ascii] 的实现,所以我认为只有PartialEq 的一种实现起作用:PartialEq<str> for &str。
编译器没有遵循我的解释并抱怨所需的类型注释。如何避免显式注释以及为什么编译器无法找出AsRef<_> 的正确实现?
谢谢
#![feature(convert)]
struct Ascii { chr: u8 }
impl AsRef<str> for [Ascii] {
fn as_ref(&self) -> &str {
unsafe { ::std::mem::transmute(self) }
}
}
fn main() {
let v = [Ascii { chr: 65 }, Ascii { chr: 66 }];
assert_eq!(v.as_ref(), "AB");
// Workaround: explicit type annotation.
//assert_eq!(AsRef::<str>::as_ref(&v[..]), "AB");
}
游戏围栏链接:http://is.gd/ZcdqXZ
<anon>:15:18: 15:26 error: type annotations required:
cannot resolve `[Ascii] : core::convert::AsRef<_>` [E0283]
<anon>:15 assert_eq!(v.as_ref(), "AB");
^~~~~~~~
【问题讨论】:
标签: rust type-inference traits