在 Option<Rc<Struct>> 上调用 map 与在 Option<Rc<i32>> 上调用不同
Calling map on an Option<Rc<Struct>> works differently than calling it on a Option<Rc<i32>>
我是 Rust 的新手,我想弄清楚为什么 Rc
在传递给闭包时表现不同。我的完整代码如下:
use std::rc::Rc;
struct Something {
value: i32
}
fn main() {
let wrapped_struct = Some(Rc::new(Something { value: 1 }));
let wrapped_integer = Some(Rc::new(1));
// Case 1: This works
let works: Option<i32> = wrapped_struct.map(|i| { i.value });
// Case 2: This fails
let fails: Option<i32> = wrapped_integer.map(|i| { i });
}
错误信息是:
|
13 | let fails: Option<i32> = wrapped_integer.map(|i| { i });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected i32, found struct `std::rc::Rc`
|
= note: expected type `std::option::Option<i32>`
found type `std::option::Option<std::rc::Rc<{integer}>>`
我不明白的是为什么在第一个闭包(案例 1)中我可以使用 i
作为 Something
(我期望 Rc<Something>
)但是在第二个(案例 2)我不能将 i
用作 i32
(我实际上得到了 Rc<i32>
)。
感谢任何指向相关文档的指示。非常感谢!
两个闭包中i
的类型实际上分别是Rc<Something>
和Rc<i32>
。 Rc
可以解除引用以访问其内部数据,但为了方便起见,在 Rust 中有些地方会自动解除引用。
在struct的情况下,当你写i.value
时,它会自动解引用i
来访问该字段。然后它 returns 是 i32
的副本,因为 i32
是 Copy
类型。所以表达式 i.value
的类型是 i32
。就好像你写了 (*i).value
,但 Rust 为你做了解引用。
在 i32
的情况下,您只是返回 i
,它的类型仍然是 Rc<i32>
。您可以通过显式取消引用来修复它:
wrapped_integer.map(|i| { *i });
另请参阅:
我是 Rust 的新手,我想弄清楚为什么 Rc
在传递给闭包时表现不同。我的完整代码如下:
use std::rc::Rc;
struct Something {
value: i32
}
fn main() {
let wrapped_struct = Some(Rc::new(Something { value: 1 }));
let wrapped_integer = Some(Rc::new(1));
// Case 1: This works
let works: Option<i32> = wrapped_struct.map(|i| { i.value });
// Case 2: This fails
let fails: Option<i32> = wrapped_integer.map(|i| { i });
}
错误信息是:
|
13 | let fails: Option<i32> = wrapped_integer.map(|i| { i });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected i32, found struct `std::rc::Rc`
|
= note: expected type `std::option::Option<i32>`
found type `std::option::Option<std::rc::Rc<{integer}>>`
我不明白的是为什么在第一个闭包(案例 1)中我可以使用 i
作为 Something
(我期望 Rc<Something>
)但是在第二个(案例 2)我不能将 i
用作 i32
(我实际上得到了 Rc<i32>
)。
感谢任何指向相关文档的指示。非常感谢!
两个闭包中i
的类型实际上分别是Rc<Something>
和Rc<i32>
。 Rc
可以解除引用以访问其内部数据,但为了方便起见,在 Rust 中有些地方会自动解除引用。
在struct的情况下,当你写i.value
时,它会自动解引用i
来访问该字段。然后它 returns 是 i32
的副本,因为 i32
是 Copy
类型。所以表达式 i.value
的类型是 i32
。就好像你写了 (*i).value
,但 Rust 为你做了解引用。
在 i32
的情况下,您只是返回 i
,它的类型仍然是 Rc<i32>
。您可以通过显式取消引用来修复它:
wrapped_integer.map(|i| { *i });
另请参阅: