不匹配的类型:expect& str在分配字符串时找到String

时间:2016-04-03 00:01:22

标签: string reference rust

我正在尝试根据args的数量分配变量值(类型class Matrix { public: // ... auto operator()(size_t R, size_t C) const; auto &operator()(size_t R, size_t C); // ... }; ):

String

我正在接受

let mut out_filename = "";
let args: Vec<_> = env::args().collect();
match args.len() {
    2 => out_filename = args[1],
    3 => out_filename = args[2],
    _ => panic!("To many params !"),
};

如何创建匹配语句,其中匹配值(1,2,3)只是一个选择器而返回的类型不同?没有src/main.rs:39:29: 39:36 error: mismatched types: expected `&str`, found `collections::string::String` (expected &-ptr, found struct `collections::string::String`) [E0308] src/main.rs:39 2 => out_filename = args[1], ..

2 个答案:

答案 0 :(得分:4)

您使用字符串文字初始化out_filename。字符串文字的类型为&str(或更具体地,&'static str),与String不同。

最简单的解决方案是直接将out_filename分配给match表达式的结果:

use std::env;

fn main() {
    let args: Vec<_> = env::args().collect();
    let out_filename = match args.len() {
        2 => &args[1],
        3 => &args[2],
        _ => panic!("Too many params !"),
    };
}
  

[...]如果我想根据args计数进行一组分配,如内部代码块{}? [...]有没有办法在没有let var = match {分配的情况下获得基本匹配的工作代码?

您可以在let表达式之前简单地放置一些没有初始值设定项的match语句,并在每个组中适当地初始化变量。如果您尝试使用可能未定义的变量,您将收到编译器错误,除非您使用let mut定义变量,否则如果您尝试多次分配变量,也会收到错误在特定的代码路径上。

use std::env;

fn main() {
    let args: Vec<_> = env::args().collect();
    let out_filename;
    match args.len() {
        2 => out_filename = &args[1],
        3 => out_filename = &args[2],
        _ => panic!("Too many params !"),
    };
}

答案 1 :(得分:1)

正如FrancisGagné所说,String&str不一样。转换它们的最简单方法是使用to_string()。它不是始终最好的事情,但它会在你刚学习的时候做,因为它将主要起作用。 You can read more about strings here

let mut out_filename = "".to_string();
let args: Vec<_> = env::args().collect();
match args.len() {
    2 => out_filename = args[1].clone(),
    3 => out_filename = args[2].clone(),
    _ => panic!("To many params !"),
};

注意,我还修复了您可能遇到的另一个错误,因为将值移出args。正如我上面所做的那样,明确地克隆它们是解决这个问题的一种方法,也许最简单,因为你也不必担心生命周期。