我正在尝试根据参数的数量分配变量值(类型 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
..
最佳答案
您使用字符串文字初始化了 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 !"),
};
}
[...] what if I wanted to make group of assignments based on args count like inside code block {} ? [...] Is there any way to get working code with basic match without
let var = match {
assign ?
您可以简单地在 match
表达式之前放置一些没有初始化器的 let
语句,并在每个臂中适本地初始化变量。如果你尝试使用一个可能 undefined variable ,你会得到一个编译器错误,除非你用 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 !"),
};
}
关于string - 不匹配的类型 : expected &str found String when assigning string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36380094/