我正在学习Rust,它看起来非常有趣。我还不是很熟悉“匹配”,但它看起来相当完整。我使用下面的代码(下面)将String转换为i64,其中包括注释掉的行“None”代替下一行“_”。我想知道在没有下划线的情况下发生了什么事情,或者“无”可能是一个全能的事情。调用代码需要一个正i64,所以否定会导致输入无效(在这种情况下)。我不确定是否可以使用此示例在返回中指示错误,而不是使用结构。
如果没有下划线作为匹配项,“无”会捕获全部,是否可以使用而不是下划线?
是否可以在不使用结构作为返回值的情况下在此类函数中返回错误?
一般情况下,使用“匹配”进行不匹配是否可能?如果是,会发生什么?
在下面的示例中,使用下划线和使用“无”之间有什么区别吗?
示例代码:
fn fParseI64(sVal: &str) -> i64 {
match from_str::<i64>(sVal) {
Some(iVal) => iVal,
// None => -1
_ => -1
}
}
答案 0 :(得分:8)
- 如果没有下划线作为匹配项,“无”会捕获所有内容,是否可以使用而不是下划线?
醇>
在这种情况下,是的。 Option<T>
只有2个案例:Some<T>
或None
。
您已经为所有值匹配Some
案例,None
是唯一的案例,所以
None
的行为与_
完全相同。
2.是否可以在不使用struct作为返回值的情况下在这样的函数中返回错误?
我建议您阅读此详细指南,了解处理错误的所有可能方法 - http://static.rust-lang.org/doc/master/tutorial-conditions.html
使用选项和结果将要求您返回结构。
3.一般情况下,使用“匹配”的非匹配是否可能?如果是,会发生什么?
如果不能保证处理所有可能的情况,Rust将不会编译match
。如果你没有匹配所有可能性,你需要有一个_
子句。
4.在下面的示例中,使用下划线和使用“无”之间有什么区别吗?
没有。见答案#1。
以下是您编写函数的众多方法中的3种:
// Returns -1 on wrong input.
fn alt_1(s: &str) -> i64 {
match from_str::<i64>(s) {
Some(i) => if i >= 0 {
i
} else {
-1
},
None => -1
}
}
// Returns None on invalid input.
fn alt_2(s: &str) -> Option<i64> {
match from_str::<i64>(s) {
Some(i) => if i >= 0 {
Some(i)
} else {
None
},
None => None
}
}
// Returns a nice message describing the problem with the input, if any.
fn alt_3(s: &str) -> Result<i64, ~str> {
match from_str::<i64>(s) {
Some(i) => if i >= 0 {
Ok(i)
} else {
Err(~"It's less than 0!")
},
None => Err(~"It's not even a valid integer!")
}
}
fn main() {
println!("{:?}", alt_1("123"));
println!("{:?}", alt_1("-123"));
println!("{:?}", alt_1("abc"));
println!("{:?}", alt_2("123"));
println!("{:?}", alt_2("-123"));
println!("{:?}", alt_2("abc"));
println!("{:?}", alt_3("123"));
println!("{:?}", alt_3("-123"));
println!("{:?}", alt_3("abc"));
}
输出:
123i64
-1i64
-1i64
Some(123i64)
None
None
Ok(123i64)
Err(~"It's less than 0!")
Err(~"It's not even a valid integer!")