如何将字符串传递给接受 Into<&str> 的方法?

How do I pass a String to a method accepting Into<&str>?

我正在尝试将 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`

Live example

如果我通过 &description,我会得到类似的错误。我正在努力理解此错误的起源以及使用签名 pub fn about<S: Into<&'b str>>(self, about: S) -> Self.

拍手的原因

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

相反,您可以:

  1. 使用 String::as_str(),它始终提供 &str
  2. AsRef 特征调用 as_ref(),导致编译器为 String;
  3. 选择实现 AsRef<str>
  4. 或重新借用字符串,从而强制转换为&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)