造轮子笔记-Result

扯淡

首先我们知道,(正常情况下)C语言是没有异常的,在C的世界中通常用返回错误码的形式判断是否出错.C++起初是由C发展而来,继承了这个特性.后来由于C++恐怖的兼收并蓄的能力,异常也成为了C++的一部分,但是与C子集的部分互不干扰.

Rust的错误处理

rust中,如果我们可能得到一个值或得不到值,可以使用Option<T>作为操作结果,然后用模式匹配判断是否得到了值.

1
2
3
4
5
6
7
8
fn find(haystack: &str, needle: char) -> Option<usize> {
for (offset, c) in haystack.char_indices() {
if c == needle {
return Some(offset);
}
}
None
}

模式匹配获得结果

1
2
3
4
5
6
7
fn main() {
let file_name = "foobar.rs";
match find(file_name, '.') {
None => println!("No file extension found."),
Some(i) => println!("File extension: {}", &file_name[i+1..]),
}
}

如果要得到一个返回值或一个错误,则可以用Result<T, E>的格式

1
2
3
4
5
6
fn ok_or<T, E>(option: Option<T>, err: E) -> Result<T, E> {
match option {
Some(val) => Ok(val),
None => Err(err),
}
}

同样可以用模式匹配(略)

除此之外Rust还提供了unwrap, unwrap_or, map等”糖”来简化代码

C++中实现Result<T, E>

Github上找到了一个实现result,实现了map,unwrap, unwrapErr等操作,但是我估计用不到,所以我仍打算自己实现(抄)一个Result<T, E>.

但是由于C++没有模式匹配,只能通过isOk,isErr等来判断

待续


本博的原创作品作品采用知识共享署名 2.5 中国大陆许可协议 进行许可,欢迎转载,但转载请注明出处,并保持转载后文章内容的完整。
本文链接:http://fallenwood.github.io/2017/02/22/cpp-11-results/