如何为 `AsRef` 提供类型注释?
How to provide a type-annotation for `AsRef`?
下面的代码显示是问题的来源。由于 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)
。
在 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()
这样的 traits 方法,您也可以使用语法调用它们:
Trait::method(obj); // equivalent to obj.method();
允许您像这样设置类型参数:
Trait::<T>::method(obj);
在您的情况下,替代语法是:
let s = "Hi";
assert!(AsRef::<str>::as_ref(&s.replace("Hi", "Ho")) == "Ho");
在这种特殊情况下,您根本不需要任何幻想:String
与 &str
相当(在 String
上有一个 PartialEq<&str>
实现) , 所以你可以直接比较它们:
let s = "Hi";
assert!(s.replace("Hi", "Ho") == "Ho");
// Or, if you prefer:
assert_eq!(s.replace("Hi", "Ho"), "Ho");
在现实生活中,您不会因为这样的原因经常需要调用 as_ref
。
下面的代码显示是问题的来源。由于 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)
。
在 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()
这样的 traits 方法,您也可以使用语法调用它们:
Trait::method(obj); // equivalent to obj.method();
允许您像这样设置类型参数:
Trait::<T>::method(obj);
在您的情况下,替代语法是:
let s = "Hi";
assert!(AsRef::<str>::as_ref(&s.replace("Hi", "Ho")) == "Ho");
在这种特殊情况下,您根本不需要任何幻想:String
与 &str
相当(在 String
上有一个 PartialEq<&str>
实现) , 所以你可以直接比较它们:
let s = "Hi";
assert!(s.replace("Hi", "Ho") == "Ho");
// Or, if you prefer:
assert_eq!(s.replace("Hi", "Ho"), "Ho");
在现实生活中,您不会因为这样的原因经常需要调用 as_ref
。