不匹配的类型:在分配字符串时预期 &str found String

MrS*_*ock 13 string reference rust

我正在尝试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 !"),
};
Run Code Online (Sandbox Code Playgroud)

我得到

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 !"),
};
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*gné 6

out_filename使用字符串文字进行了初始化。字符串文字的类型是&str(或更具体地说,&'static str),它不同于String

最简单的解决方案是直接赋值out_filenamematch表达式的结果:

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 !"),
    };
}
Run Code Online (Sandbox Code Playgroud)

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

您可以简单地letmatch表达式之前放置一些没有初始化器的语句,并在每个分支中适当地初始化变量。如果您尝试使用可能未定义的变量,则会出现编译器错误,除非您使用 定义变量,否则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 !"),
    };
}
Run Code Online (Sandbox Code Playgroud)