【问题标题】:mismatched String type in RustRust 中不匹配的字符串类型
【发布时间】:2020-06-14 08:19:46
【问题描述】:

我目前正在尝试学习 Rust,当我尝试按照官方书籍教程进行操作时,遇到了书中未描述的错误。

use std::env;
use std::fs;

fn main() {
    let args: Vec<String> = env::args().collect();
    let config = Config::new(&args);
    println!("Searching for {}", config.query);
    println!("In file {}", config.filename);
    println!("{:?}", args);

    let contents = fs::read_to_string(config.filename)
        .expect("Something went wrong reading the file");
    println!("With text:\n{}", contents);
}

struct Config {
    query: String,
    filename: String,
}
impl Config {
    fn new(args: &[String]) -> Config {
        let query = &args[1].clone();
        let filename = &args[2].clone();

        Config { query, filename }
    }
}

但我不断从编译器收到以下错误:

error[E0308]: mismatched types
  --> src/main.rs:25:18
   |
25 |         Config { query, filename }
   |                  ^^^^^
   |                  |
   |                  expected struct `std::string::String`, found `&str`
   |                  help: try using a conversion method: `query: query.to_string()`

error[E0308]: mismatched types
  --> src/main.rs:25:25
   |
25 |         Config { query, filename }
   |                         ^^^^^^^^
   |                         |
   |                         expected struct `std::string::String`, found `&std::string::String`
   |                         help: try using a conversion method: `filename: filename.to_string()`

error: aborting due to 2 previous errors

我试过做类似的事情:

        let query = &args[1].clone().to_string();
        let filename = &args[2].clone().to_owned().to_string();

但它带来了同样的错误。最后,我通过应用以下更改设法解决了这个问题:

struct Config<'a> {
    query: &'a str,
    filename: &'a str,
}
impl Config <'_> {
    fn new(args: &[String]) -> Config {
        let query = &*args[1];
        let filename = &*args[2];

        Config { query, filename }
    }
}

我的理解是 new() 无法返回拥有字符串的结构,因为值查询和文件名被分配了引用值,并且由于某种原因,函数 to_string()、to_owned() 和 clone() 都没有转换将引用的 Sting 转换为拥有的 Sting。 有谁知道为什么我必须使用带有生命周期的引用 sices 而不是字符串? 另外,有没有办法像教程中一样使用String类型(https://doc.rust-lang.org/book/ch12-03-improving-error-handling-and-modularity.html)?

【问题讨论】:

    标签: rust


    【解决方案1】:

    查询和文件名类型是&String,克隆方法使用&self,你应该这样做

    impl Config {
        fn new(args: &[String]) -> Config {
            let query = args[1].clone();
            let filename = args[2].clone();
    
            Config { query, filename }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2019-03-26
      相关资源
      最近更新 更多