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

时间:2015-03-26 12:52:24

标签: rust type-inference traits

我在我的代码中使用了新的通用转换特性,体验了人体工程学的减少。正如您在示例中所看到的,有问题的代码实现了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");
                       ^~~~~~~~

1 个答案:

答案 0 :(得分:1)

更详细地查看文档中的listed implementors of AsRef,您会发现有另一个实现在那里发生冲突:impl<T> AsRef<[T]> for [T]。因此,无法确定v.as_ref()&str还是&[Ascii]类型。