在`assert_eq!()`中使用`as_ref()`时需要输入注释

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)

Chr*_*gan 1

更详细地查看文档中列出的实现者AsRef,您会发现还有另一个冲突的实现:impl<T> AsRef<[T]> for [T]。所以它可以\xe2\x80\x99t决定是否v.as_ref()应该是类型&str&[Ascii].

\n