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