rust - 在选项上调用地图> 工作方式与在选项上调用它不同>
问题描述
我是 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
以访问该字段。然后它返回 , 的副本i32
,因为i32
它是一种Copy
类型。所以表达式的类型i.value
是i32
。就好像你写了(*i).value
,但是 Rust 为你做了解引用。
在这种i32
情况下,您只是返回i
仍然具有 type的Rc<i32>
。您可以通过显式取消引用来修复它:
wrapped_integer.map(|i| { *i });
也可以看看:
推荐阅读
- python - BeautifulSoup 刮新闻文章
- django - 如何创建 Django 有序列表
- javascript - 为什么我的 javascript 箭头函数在 Edge/IE 中不起作用?
- woocommerce - 在 woocommerce 中,我如何检索所有变体,例如 get_available_variations 但包括不可见
- r - 过滤具有 %in% 模式的数据集
- java - 如何测试 jdbi BinderFactory
- java - 从图像 Java 中删除 chromakey 的简单方法
- events - chrome 扩展内容脚本 (Shadow DOM) 中的 Google Analytics 点击事件跟踪
- json - 来自 OPENJONS() 的 TSQL 具有显式架构:十进制 (38,30) 数据类型中的空字符串
- python - 使用 OpenCV 出错,程序意外关闭