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)