我在代码中使用了新的通用转换特性,并使用了简化的人机工程学。如您在示例中所看到的,所讨论的代码实现了AsRef<str> for [Ascii]
。
现在,我希望在assert_eq!()
中使用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");
^~~~~~~~
发布于 2015-03-26 13:29:38
更详细地查看文档中的AsRef
,您会发现还有另一个实现发生了冲突:impl<T> AsRef<[T]> for [T]
。因此,它不能决定v.as_ref()
应该是&str
类型还是&[Ascii]
类型。
https://stackoverflow.com/questions/29278940
复制