我正在尝试传递String
来鼓掌的生成器方法:
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]: the trait bound `&str: std::convert::From<std::string::String>` is not satisfied
--> src/main.rs:11:34
|
11 | let matches = App::new(NAME).about(description).get_matches();
| ^^^^^ the trait `std::convert::From<std::string::String>` is not implemented for `&str`
|
= note: required because of the requirements on the impl of `std::convert::Into<&str>` for `std::string::String`
如果我通过&description
,也会收到类似的错误。我正在努力了解此错误的起因以及使用签名pub fn about<S: Into<&'b str>>(self, about: S) -> Self
拍手的原因。
答案 0 :(得分:3)
在给定的Into<&str>
约束下,编译器无法将String
或&String
直接转换为请求的字符串切片。对于字符串切片,From<String>
或From<&String>
都没有这样的实现。从拥有的字符串或类似字符串的值到切片的转换通常是通过其他特性完成的。
相反,您可以:
String::as_str()
,它始终提供&str
; AsRef
特性调用as_ref()
,导致编译器为AsRef<str>
选择实现String
; &str
。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)