Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何为'AsRef'提供类型注释?_Rust - Fatal编程技术网

Rust 如何为'AsRef'提供类型注释?

Rust 如何为'AsRef'提供类型注释?,rust,Rust,下面的代码显示了问题的来源。由于不推荐使用as\u slice(),因此建议使用as\u 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!

下面的代码显示了问题的来源。由于不推荐使用
as\u slice()
,因此建议使用
as\u 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");
let s=“Hi”//这是一个字符串片段
//警告:使用不推荐的项:请改用std::convert::AsRef,#[警告(不推荐)]默认为启用
断言!(s.将“Hi”、“Ho”)替换为“Ho”;
//tests/lang.rs:120:35:120:43错误:需要类型批注:无法解析`collections::string::string:core::convert::AsRef`[E0283]
//断言!(s.将“Hi”、“Ho”)替换为“Ho”);
如何提供这样的类型批注?。我认为唯一适用的语法是
::as_ref()
,但我不知道如何在实例中实现这一点


我使用的是
rustc 1.0.0-nightly(be9bd7c93 2015-04-05)(2015-04-05构建)

对于
String
&str
,最简单的语法是:

在您的情况下,会给出:

let s = "Hi";
assert!(&s.replace("Hi", "Ho")[..] == "Ho");
但是,对于traits方法,如
as_ref()
,也可以使用以下语法调用它们:

Trait::method(obj); // equivalent to obj.method();
允许您按如下方式设置类型参数:

Trait::<T>::method(obj);
Trait:::方法(obj);
在您的情况下,另一种语法是:

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

在这种特殊情况下,您根本不需要任何幻想:
字符串
&str
相当(在
字符串
上有一个
PartialEq
实现),因此您可以直接比较它们:

let s=“Hi”;
断言!(s.替换“Hi”、“Ho”)=“Ho”);
//或者,如果您愿意:
断言!(s.替换“Hi”、“Ho”)、“Ho”);

在现实生活中,由于这样的原因,您不需要经常将
称为_ref

实际上
&s
(即,无切片)更简单。@delnan是的,确实没有对此进行修改。但它并不总是起作用(如果您想将
字符串
与一组
&str
值进行匹配(例如,如下所示)是的,它必须在deref强制应用的上下文中进行。尽管人们总是可以做
让foo_str:&str=&foo并使用它。这不是
Deref
impl/dereference,而是
impl for String
:@huon dbaupp:好的观点。我没有停下来好好考虑一下,但是像
==
这样的东西确实不会做任何像那样的自动引用/自动删除。顺便说一下:这个例子基于我的一个旧测试,它被移植到了最新的rustc。回到过去,仍然需要as_slice()。如今,人们只能依靠各种答案所描述的自动转换。
let s = "Hi";
assert!(AsRef::<str>::as_ref(&s.replace("Hi", "Ho")) == "Ho");