result & option
result
与option
转换
Option
转 Result
ok_or
: 将Option
转换为Result
,如果是None
,则使用提供的错误值。let opt: Option<i32> = Some(42); let result: Result<i32, &str> = opt.ok_or("error"); assert_eq!(result, Ok(42)); let none: Option<i32> = None; let result: Result<i32, &str> = none.ok_or("error"); assert_eq!(result, Err("error"));
ok_or_else
: 类似于ok_or
,但错误值是通过闭包计算得到的。let opt: Option<i32> = Some(42); let result: Result<i32, String> = opt.ok_or_else(|| "error".to_string()); assert_eq!(result, Ok(42)); let none: Option<i32> = None; let result: Result<i32, String> = none.ok_or_else(|| "error".to_string()); assert_eq!(result, Err("error".to_string()));
Result
转 Option
ok
: 将Result
转换为Option
,如果是Err
,则返回None
。let res: Result<i32, &str> = Ok(42); let opt: Option<i32> = res.ok(); assert_eq!(opt, Some(42)); let res: Result<i32, &str> = Err("error"); let opt: Option<i32> = res.ok(); assert_eq!(opt, None);
err
: 将Result
转换为Option
,如果是Ok
,则返回None
。let res: Result<i32, &str> = Ok(42); let opt: Option<&str> = res.err(); assert_eq!(opt, None); let res: Result<i32, &str> = Err("error"); let opt: Option<&str> = res.err(); assert_eq!(opt, Some("error"));
Result
创建和解构
Ok
andErr
Variants:let success: Result<i32, &str> = Ok(42); let failure: Result<i32, &str> = Err("error");
查询和提取值
is_ok
: 检查Result
是否是Ok
。assert!(success.is_ok());
is_err
: 检查Result
是否是Err
。assert!(failure.is_err());
ok
: 将Result
转换为Option
,丢弃Err
值。let opt = success.ok(); // Some(42)
err
: 将Result
转换为Option
,丢弃Ok
值。let opt = failure.err(); // Some("error")
变换和操作
map
: 对Ok
值应用函数。let res = success.map(|x| x + 1); // Ok(43)
map_err
: 对Err
值应用函数。let res = failure.map_err(|e| e.to_uppercase()); // Err("ERROR")
and_then
: 链接多个可能出错的操作。let res = success.and_then(|x| Ok(x + 1)); // Ok(43)
or_else
: 链接多个可能失败的操作。let res = failure.or_else(|_| Ok(0)); // Ok(0)
提取和解包
unwrap
: 提取Ok
值,如果是Err
则 panic。let value = success.unwrap(); // 42
unwrap_err
: 提取Err
值,如果是Ok
则 panic。let error = failure.unwrap_err(); // "error"
unwrap_or
: 提取Ok
值,如果是Err
则返回默认值。let value = failure.unwrap_or(0); // 0
unwrap_or_else
: 提取Ok
值,如果是Err
则计算一个默认值。let value = failure.unwrap_or_else(|_| 0); // 0
错误处理
expect
: 提取Ok
值,如果是Err
则 panic 并打印自定义错误信息。let value = success.expect("Operation failed"); // 42
expect_err
: 提取Err
值,如果是Ok
则 panic 并打印自定义错误信息。let error = failure.expect_err("Unexpected success"); // "error"
其他实用方法
transpose
: 将Result<Option<T>, E>
转换为Option<Result<T, E>>
。let opt_res: Option<Result<i32, &str>> = Ok(Some(42)).transpose(); // opt_res: Some(Ok(42))
flatten
: 将Result<Result<T, E>, E>
扁平化为Result<T, E>
。let nested_res: Result<Result<i32, &str>, &str> = Ok(Ok(42)); let flat_res: Result<i32, &str> = nested_res.flatten(); // flat_res: Ok(42)
copied
: 将Result<&T, E>
转换为Result<T, E>
,其中T
实现了Copy
。let res: Result<&i32, &str> = Ok(&42); let copied_res: Result<i32, &str> = res.copied(); // copied_res: Ok(42)
cloned
: 将Result<&T, E>
转换为Result<T, E>
,其中T
实现了Clone
。let res: Result<&String, &str> = Ok(&"hello".to_string()); let cloned_res: Result<String, &str> = res.cloned(); // cloned_res: Ok("hello".to_string())
Option
创建和构造
Some
和None
:let some_value: Option<i32> = Some(5); let none_value: Option<i32> = None;
检查内容
is_some
和is_none
:let x: Option<i32> = Some(2); assert!(x.is_some()); assert!(!x.is_none());
contains
: 检查Option
是否包含指定的值。let x: Option<i32> = Some(2); assert!(x.contains(&2));
访问内容
unwrap
: 获取值,如果是None
则会 panic。let x: Option<i32> = Some(2); let y: i32 = x.unwrap();
unwrap_or
: 获取值,如果是None
则返回默认值。let x: Option<i32> = None; let y: i32 = x.unwrap_or(10);
unwrap_or_else
: 获取值,如果是None
则调用闭包返回默认值。let x: Option<i32> = None; let y: i32 = x.unwrap_or_else(|| 2 * 5);
unwrap_or_default
: 获取值,如果是None
则返回Default
值。let x: Option<i32> = None; let y: i32 = x.unwrap_or_default();
expect
: 获取值,如果是None
则 panic 并打印提供的错误信息。let x: Option<i32> = Some(2); let y: i32 = x.expect("Expected a value");
expect_none
: 检查是否为None
,否则 panic。let x: Option<i32> = None; x.expect_none("Expected None");
expect_some
: 检查是否为Some
,否则 panic。let x: Option<i32> = Some(2); let y: i32 = x.expect_some("Expected Some");
转换
map
: 对值应用函数,如果是None
则返回None
。let x: Option<i32> = Some(2); let y: Option<i32> = x.map(|v| v + 1);
map_or
: 对值应用函数,如果是None
则返回默认值。let x: Option<i32> = Some(2); let y: i32 = x.map_or(10, |v| v + 1);
map_or_else
: 对值应用函数,如果是None
则调用闭包返回默认值。let x: Option<i32> = Some(2); let y: i32 = x.map_or_else(|| 10, |v| v + 1);
and
: 如果是Some
,返回other
,否则返回None
。let x: Option<i32> = Some(2); let y: Option<&str> = Some("foo"); let z: Option<&str> = x.and(y);
and_then
: 对值应用函数,返回Option
,如果是None
则返回None
。let x: Option<i32> = Some(2); let y: Option<i32> = x.and_then(|v| Some(v + 1));
filter
: 过滤值,如果值满足谓词则返回Some
,否则返回None
。let x: Option<i32> = Some(2); let y: Option<i32> = x.filter(|&v| v > 1);
or
: 如果是None
,返回other
,否则返回自身。let x: Option<i32> = None; let y: Option<i32> = Some(10); let z: Option<i32> = x.or(y);
or_else
: 如果是None
,调用闭包返回Option
,否则返回自身。let x: Option<i32> = None; let y: Option<i32> = x.or_else(|| Some(10));
flatten
: 将Option<Option<T>>
转换为Option<T>
。let x: Option<Option<i32>> = Some(Some(2)); let y: Option<i32> = x.flatten();
结果转换
ok_or
: 将Option
转换为Result
,如果是None
则返回提供的错误值。let x: Option<i32> = Some(2); let y: Result<i32, &str> = x.ok_or("error");
ok_or_else
: 将Option
转换为Result
,如果是None
则调用闭包返回错误值。let x: Option<i32> = Some(2); let y: Result<i32, String> = x.ok_or_else(|| "error".to_string());
迭代
iter
: 返回包含Option
值的迭代器。let x: Option<i32> = Some(2); for val in x.iter() { println!("{}", val); }
into_iter
: 将Option
转换为所有权迭代器。let x: Option<i32> = Some(2); for val in x.into_iter() { println!("{}", val); }
as_ref
: 将Option
转换为包含引用的Option
。let x: Option<i32> = Some(2); let y: Option<&i32> = x.as_ref();
as_mut
: 将Option
转换为包含可变引用的Option
。let mut x: Option<i32> = Some(2); if let Some(v) = x.as_mut() { *v += 1; }
排除
take
: 将Option
的值取出,留下None
。let mut x: Option<i32> = Some(2); let y: Option<i32> = x.take(); assert_eq!(x, None); assert_eq!(y, Some(2));
replace
: 替换Option
的值,返回旧值。let mut x: Option<i32> = Some(2); let y: Option<i32> = x.replace(5); assert_eq!(x, Some(5)); assert_eq!(y, Some(2));
常量
is_none
: 判断是否为None
。is_some
: 判断是否为Some
。contains
: 判断是否包含指定值。expect
: 获取值或 panic。unwrap
: 获取值或 panic。unwrap_or
: 获取值或返回默认值。unwrap_or_else
: 获取值或调用闭包返回默认值。unwrap_or_default
: 获取值或返回默认值。
这些方法提供了丰富的操作 Option
类型的方式,帮助开发者有效处理可能为空的值。