如何为`AsRef`提供类型注释?

时间:2015-04-15 06:44:39

标签: rust

以下代码显示问题的来源。由于不推荐使用as_slice(),因此建议将as_ref()作为替代。

但是,在此上下文中使用它时,需要类型注释。

let s = "Hi";             // This is a string slice
// warning: use of deprecated item: use std::convert::AsRef<str> instead, #[warn(deprecated)] on by default
assert!(s.replace("Hi", "Ho").as_slice() == "Ho");
// tests/lang.rs:120:35: 120:43 error: type annotations required: cannot resolve `collections::string::String : core::convert::AsRef<_>` [E0283]
// assert!(s.replace("Hi", "Ho").as_ref() == "Ho");

如何提供此类型注释?。我认为唯一适用的语法是<MyType as AsRef>::as_ref(),但我不知道如何使用实例。

我正在使用rustc 1.0.0-nightly (be9bd7c93 2015-04-05) (built 2015-04-05)

2 个答案:

答案 0 :(得分:8)

在这种特殊情况下,您根本不需要任何幻想:String&str相当(PartialEq<&str>上有String个实施),所以你可以直接比较它们:

let s = "Hi";
assert!(s.replace("Hi", "Ho") == "Ho");
// Or, if you prefer:
assert_eq!(s.replace("Hi", "Ho"), "Ho");

在现实生活中,你不会经常因为这样的原因而打电话给as_ref

答案 1 :(得分:7)

String&str的确切情况下,最简单的方法是使用Index语法:

let s: String = "foo".to_string();
let slice: &str = &s[..]; // full range index

在你的情况下,会给出:

let s = "Hi";
assert!(&s.replace("Hi", "Ho")[..] == "Ho");

但是,对于像as_ref()这样的特征方法,您也可以使用以下语法调用它们:

Trait::method(obj); // equivalent to obj.method();

允许您设置类型参数,如下所示:

Trait::<T>::method(obj);

在您的情况下,替代语法将是:

let s = "Hi";
assert!(AsRef::<str>::as_ref(&s.replace("Hi", "Ho")) == "Ho");