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
创建和解构
OkandErrVariants: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(); // 42unwrap_err: 提取Err值,如果是Ok则 panic。let error = failure.unwrap_err(); // "error"unwrap_or: 提取Ok值,如果是Err则返回默认值。let value = failure.unwrap_or(0); // 0unwrap_or_else: 提取Ok值,如果是Err则计算一个默认值。let value = failure.unwrap_or_else(|_| 0); // 0
错误处理
expect: 提取Ok值,如果是Err则 panic 并打印自定义错误信息。let value = success.expect("Operation failed"); // 42expect_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 类型的方式,帮助开发者有效处理可能为空的值。