首页 > 解决方案 > 在选项上调用地图> 工作方式与在选项上调用它不同>

问题描述

我是 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>)。

我感谢任何指向相关文档的指针。非常感谢!

标签: rustsmart-pointersdereferencereference-counting

解决方案


两个闭包中的类型i实际上Rc<Something>分别是Rc<i32>Rc可以取消引用以访问其内部数据,但为了方便起见,Rust 中有些地方会自动进行取消引用。

在 struct 情况下,当您编写 时i.value,它将自动取消引用i以访问该字段。然后它返回 , 的副本i32,因为i32它是一种Copy类型。所以表达式的类型i.valuei32。就好像你写了(*i).value,但是 Rust 为你做了解引用。

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

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

也可以看看:


推荐阅读