1

我正在尝试将 a 传递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]: 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

4

1 回答 1

4

使用给定的(不寻常的)约束Into<&str>,编译器无法将 aString或 a&String直接转换为请求的字符串切片。对于字符串切片,没有任何From<String>,也没有这样的实现。From<&String>从拥有的字符串或类似字符串的值到切片的转换通常是通过其他特征完成的。

相反,您可以:

  1. 使用String::as_str(),它总是提供&str
  2. as_ref()AsReftrait调用,导致编译器选择;的AsRef<str>实现String
  3. 或者重新借用字符串,从而强制转换为&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)
于 2018-08-29T18:39:53.847 回答