Rust 如何将字符串传递给接受<;的方法&;str>;?
我正在尝试将Rust 如何将字符串传递给接受<;的方法&;str>;?,rust,clap,Rust,Clap,我正在尝试将字符串传递给clap的生成器方法: extern crate clap; // 2.32.0 use clap::App; const NAME: &'static str = "example"; const DESC_PART_1: &'static str = "desc"; const DESC_PART_2: &'static str = "ription"; fn main() { let description: String =
字符串
传递给clap的生成器方法:
extern crate clap; // 2.32.0
use clap::App;
const NAME: &'static str = "example";
const DESC_PART_1: &'static str = "desc";
const DESC_PART_2: &'static str = "ription";
fn main() {
let description: String = format!("{}{}", DESC_PART_1, DESC_PART_2);
let matches = App::new(NAME).about(description).get_matches();
}
我得到一个错误:
error[E0277]:未满足特性绑定“%str:std::convert::From”
-->src/main.rs:11:34
|
11 | let matches=App::new(NAME).about(description).get_matches();
|^^^^特性“std::convert::From”未为“&str”实现`
|
=注意:由于'std::convert::Into'for`std::string::string的impl上的要求,因此需要`
如果我通过&description
,我会收到类似的错误。我正在努力理解这个错误的起源以及使用签名pub fn about的clap背后的原因,在转化为的给定(异常)约束下,编译器无法将字符串或字符串直接转化为请求的字符串片段。对于字符串片段,既没有来自
的实现,也没有来自
的实现。从拥有的字符串或类似字符串的值到切片的转换通常通过其他特性完成
相反,您可以:
使用,它始终提供&str
李>
从trait调用as_ref()
,引导编译器为字符串选择实现AsRef
李>
或者重新借用字符串,从而强制转换为&str
FWIW,description.as_ref()
有效。它也有效!你知道为什么这是有效的,而不是&
?太好了:)你知道为什么编译器不能直接转换吗?我很想了解fully@JMAA刚刚更新。基本上,这个API请求一个到
中有点不寻常。对于字符串片段,没有这样的From
实现,编译器也不会强制&string
实现到中。其他API通常选择直接获取参数T:AsRef
或字符串切片,从而避免了这些问题。@JMAA我认为标准库可以将实现到for&string
;也许你可以试一试,并尝试贡献它@E_net4我刚才留下了一条几乎相同的评论:)之所以没有将转化为for String
的实现,是因为转化为会消耗self,所以它不可能返回引用类型。@PeterHall Right!对于&String
,情况也并非如此,但它尚未实现。(或者至少我们认为目前可以)
let matches = App::new(NAME).about(description.as_str()).get_matches(); // (1)
let matches = App::new(NAME).about(description.as_ref()).get_matches(); // (2)
let matches = App::new(NAME).about(&*description).get_matches(); // (3)