我在我的代码中使用了新的通用转换特性,体验了人体工程学的减少。正如您在示例中所看到的,有问题的代码实现了AsRef<str> for [Ascii]
。
现在我想在v.as_ref()
中使用assert_eq!()
并期望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");
^~~~~~~~
答案 0 :(得分:1)
更详细地查看文档中的listed implementors of AsRef
,您会发现有另一个实现在那里发生冲突:impl<T> AsRef<[T]> for [T]
。因此,无法确定v.as_ref()
是&str
还是&[Ascii]
类型。