我正在尝试根据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
..
你用字符串文字初始化了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 !"),
};
}
正如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
。正如我上面所做的那样,明确地克隆它们是解决这个问题的一种方法,也许最简单,因为你也不必担心生命。