【发布时间】:2015-08-28 12:44:17
【问题描述】:
我在更改选项内部结构的字段时遇到问题。这是代码:
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有很多字段而且很繁琐。
【问题讨论】:
标签: rust