Option::and_then
函数可以简化此代码:
let foo = Some(1);
let bar = match foo {
Some(i) => Some(i + 1),
None => None,
};
println!("Foo: {:?}", foo);
对此:
let foo = Some(1);
let bar = foo.and_then(|i| Some(i + 1));
println!("Foo: {:?}", foo);
如果我对String
个进行同样的try ,它不会编译:
let foo = Some("bla".to_string());
let bar = foo.and_then(|ref f| Some(f.clone()));
println!("Foo: {:?}", foo);
error[E0382]: use of moved value: `foo`
--> src/main.rs:4:27
|
3 | let bar = foo.and_then(|ref f| Some(f.clone()));
| --- value moved here
4 | println!("Foo: {:?}", foo);
| ^^^ value used here after move
|
= note: move occurs because `foo` has type `std::option::Option<std::string::String>`, which does not implement the `Copy` trait
然而,相应的match
个表达式起作用:
let foo = Some("bla".to_string());
let bar = match foo {
Some(ref f) => Some(f.clone()),
None => None,
};
println!("Foo: {:?}", foo);
有没有办法像我的第一个例子那样用整数来缩短这个匹配表达式?
在这个最小的例子中,我可以使用
map
,但在我的实际代码中,我调用了另一个返回Option
的函数,所以我真的需要and_then
.只是我不想用一个不影响问题的额外函数使示例过于复杂.我真的需要在之后使用
foo
,否则就不会有任何问题(事实上,foo
是由一个闭包捕获的,我需要多次使用,老兄!我很难找到编译器为什么一直拒绝我的代码!错误the trait FnMut... is not implemented for the type [closure@...]
没有给出太多指示,说明为什么不这样做).我在这个例子中使用了
clone
,因为我想要一个使用字符串的简单操作.在实际代码中,foo
不是字符串(它是Regex
),我也不是在闭包中克隆它(我是在字符串上应用它并处理结果).此外,此代码将被多次调用,因此避免不必要的分配和复制非常重要.