Tho*_*mas 5 type-inference traits rust
我在我的代码中使用了新的通用转换特性,体验了人体工程学的减少.AsRef<str> for [Ascii]正如您在示例中看到的那样,有问题的代码实现了.
现在我想使用v.as_ref()in assert_eq!()并期望使用提供的实现v.as_ref()返回a &str,因为第二个参数assert_eq!()是type &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");
}
Run Code Online (Sandbox Code Playgroud)
围栏链接: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");
^~~~~~~~
Run Code Online (Sandbox Code Playgroud)
更详细地查看文档中列出的实现者AsRef,您会发现还有另一个冲突的实现:impl<T> AsRef<[T]> for [T]。所以它可以\xe2\x80\x99t决定是否v.as_ref()应该是类型&str或&[Ascii].