gpt4 book ai didi

rust - 仅当两个变量不为 None 而不复制它们时,如何执行操作?

转载 作者:行者123 更新时间:2023-11-29 08:21:49 26 4
gpt4 key购买 nike

当且仅当ab 不是None 时,我想执行一个操作。我不想创建复杂结构的副本,这就是 struct X 未实现 Clone 的原因。

use std::sync::{Arc, Mutex};
use std::cell::RefCell;

#[derive(Debug)]
struct X {
d: u32,
}

struct Foo {
a: Option<X>,
b: Option<u32>,
c: u32,
}

fn main() {
let smart_ptr = Arc::new(Mutex::new(RefCell::new(Foo {
a: Some(X { d: 1 }),
b: Some(2),
c: 3,
})));

{
let lock = smart_ptr.lock().unwrap();
let foo = lock.borrow();
if let (Some(ref a), Some(b)) = (foo.a, foo.b) {
println!("a: {:?}, b: {}", a, b);
}
}
}

如果我尝试编译这段代码,我会得到:

error[E0507]: cannot move out of borrowed content
--> src/main.rs:25:42
|
25 | if let (Some(ref a), Some(b)) = (foo.a, foo.b) {
| ^^^ cannot move out of borrowed content

我应该如何修复 if 语句以在没有编译错误的情况下获得我想要的内容?

最佳答案

使用一个更小的例子:

struct Foo {
a: Option<String>,
b: Option<String>,
}

fn main() {
let foo = &Foo {
a: Some("hi".into()),
b: Some("world".into()),
};

if let (Some(a), Some(b)) = (foo.a, foo.b) {
println!("a: {}, b: {}", a, b);
}
}

您可以使用 Option::as_ref对引用执行与 the previous answer 相同类型的匹配:

if let (Some(a), Some(b)) = (foo.a.as_ref(), foo.b.as_ref()) {
println!("a: {}, b: {}", a, b);
}

关于rust - 仅当两个变量不为 None 而不复制它们时,如何执行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com