在 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 的副本,因为 i32Copy 类型。所以表达式 i.value 的类型是 i32。就好像你写了 (*i).value,但 Rust 为你做了解引用。

i32 的情况下,您只是返回 i,它的类型仍然是 Rc<i32>。您可以通过显式取消引用来修复它:

wrapped_integer.map(|i| { *i });

另请参阅: