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

问题描述 投票:2回答:2

我正在尝试根据args的数量分配变量值(类型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 !"),
};

而且我得到了

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],

如何创建匹配语句,匹配值(1,2,3)只是一个选择器,返回的类型是不同的?没有let var = match ..

string reference rust
2个回答
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
投票

正如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。正如我上面所做的那样,明确地克隆它们是解决这个问题的一种方法,也许最简单,因为你也不必担心生命。

© www.soinside.com 2019 - 2024. All rights reserved.