我在尝试修改一个Option内部结构体的字段时遇到了问题。这是代码:
struct MyStruct {
field1 : i32,
field2 : i32,
// and many more...
}
impl MyStruct {
pub fn field1(&mut self, field1 : i32) -> &mut Self {
self.field1 = field1;
self
}
}
fn foo() -> Option<MyStruct> {
None
}
fn bar() -> Option<MyStruct> {
foo().as_mut().map(|s| s.field1(5))
}
fn main() {
bar();
}
bar()
的主要思想是从另一个返回Option<MyStruct>
的函数中获取一个Option<MyStruct>
,改变该结构体的一个字段(如果结果不为None
),然后返回生成的Option<MyStruct>
。
该结构体实现了构建器模式,因此我已经使用它。
在这种情况下,我得到以下错误:
test.rs:18:5: 18:40 error: mismatched types:
expected `core::option::Option<MyStruct>`,
found `core::option::Option<&mut MyStruct>`
(expected struct `MyStruct`,
found &-ptr) [E0308]
test.rs:18 foo().as_mut().map(|s| s.field1(5))
我也尝试过使用 Option.take()
以及将构建器方法的签名更改为 pub fn field1(mut self, field1 : i32) -> Self
,但它们都不起作用。
如何让这段代码起作用?
我知道我可以创建另一个 Option
并将输入的每个字段映射到输出的相应字段,但是 MyStruct
有很多字段,这很繁琐。
field1()
的签名有问题? - mbrt|mut s| { s.field1(5); s }
。该方法会修改对象,但其返回值 &mut 对于按值返回是无用的。 - user395760