多次读取 Option<&mut T> 的引用

2023-12-26

我有一个Option<&mut T>并且想要多次访问包含的引用,如下所示:

fn f(a: Option<&mut i32>) {
    if let Some(x) = a {
        *x = 6;
    }
    // ...
    if let Some(x) = a {
        *x = 7;
    }
}

fn main() {
    let mut x = 5;
    f(Some(&mut x));
}

那是行不通的,因为if let Some(x) = a将参考值移出选项,第二个if let Some(x) = a将导致编译器错误。没有第二个if let ...,这可以完美地工作,所以a不一定是可变的。

下列:

if let Some(ref x) = a {
    **x = 6;
}

给出错误:“分配给不可变引用”。

这会起作用:

fn f(mut a: Option<&mut i32>) {
    if let Some(ref mut x) = a {
        **x = 6;
    }
    if let Some(ref mut x) = a {
        **x = 7;
    }
}

The mut a是必要的,否则我会收到错误“无法借用不可变的匿名字段”(a:std::prelude::v1::Some).0是可变的”。但这感觉不对:a不应该是可变的,因为我没有修改它(见上文)。

正确的解决办法是什么?

Edit 1

我的问题与其中的问题不同如何将 `Option` 传递给多个函数调用而不导致移动错误? https://stackoverflow.com/questions/40658487/how-to-pass-optionmut-to-multiple-function-calls-without-causing-move-e。我想可变地取消引用中的引用Option<&mut T>多次,而另一个想要通过Option到多个函数调用。其他问题的解决方案不适用于我的情况。


那这个呢?

fn f(a: Option<&mut i32>) {
    if let Some(&mut ref mut x) = a {
        *x = 6;
    }
    // ...
    if let Some(&mut ref mut x) = a {
        *x = 7;
    }
}

在这种情况下,a不需要是可变的。

The &mut ref mut感觉有点尴尬,但这是有道理的:首先我们删除一个&mut通过解构,然后再次获取对该值的可变引用。当我们不使用时更明显Option:

let mr: &mut Vec<u32> = &mut vec![];
{
    let &mut ref mut a = mr;
    a.push(3);
}
mr.push(4);

这也有效。第三行(特殊)相当于:

let a = &mut     *mr   ;
//               ^^^----- this is an lvalue of type `Vec<u32>`
//      ^^^^^^^^^^^^----- together it's of type `&mut Vec<u32>` again

In the Option这种情况下,我们不能使用&mut *X版本,但需要在模式内完成所有操作。就这样&mut ref mut x.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多次读取 Option<&mut T> 的引用 的相关文章

随机推荐

  • Facebook 营销 API。地理搜索

    我正在尝试从 Facebook 获取一个国家 地区所有城市的列表 我从 v2 9 的 FB 文档开始 Facebook 营销 API https developers facebook com docs marketing api targ
  • 从 Windows 批处理文件将空白行回显到控制台 [重复]

    这个问题在这里已经有答案了 当从 Windows 批处理文件将状态消息输出到控制台时 我想输出空行分解输出 我该怎么做呢 以下三个选项中的任何一个都适合您 echo echo echo 例如 echo off echo There will
  • 在 Heroku 上安装 PyODBC 时找不到 sql.h

    我正在尝试在 Heroku 上安装 PyODBC 但我得到fatal error sql h No such file or directorypip 运行时的日志中 我该如何修复这个错误 要跟进下面的答案 Ubuntu 的示例 sudo
  • Azure Functions RunOnStartUp 在配置中设置而不是在编译时设置?

    我有一个 Azure 计时器触发函数 计划在生产中每 3 个月运行一次 然而 在测试环境中 我希望它在每次触发时在启动时运行 目前我有 TimerTrigger TimerInterval RunOnStartup false 我真的不想改
  • 使用 dplyr 和 rollapply 在数据框中滚动预测

    我的第一个问题在这里 我的目标是 给定一个带有预测变量的数据框 每列一个预测变量 行观察值 使用 lm 拟合回归 然后使用滚动窗口使用最后一个观察值来预测值 数据框如下所示 gt DfPredictor 1 40 Y X1 X2 X3 X4
  • 为什么人们一致推荐使用 appConfig 而不是使用设置文件? (。网)

    我经常看到这样的问题的答案 我应该如何在我的 NET 应用程序中存储设置 是通过手动向 app config 或 web config 添加条目来编辑 app config 文件 如下所示
  • 参数“ContactsCtrl”不是函数,未定义

    我在 AngularJS 路由和控制器中遇到问题 这是代码 索引 html div div index js var myApp angular module contacts
  • 水豚服务器和浏览器错误,服务器上没有任何痕迹

    由于某种原因 我的黄瓜测试之一似乎在 poltergeist 驱动程序和 Rails 服务器上都失败了 我得到了浏览器崩溃的完整跟踪信息 但服务器端几乎没有任何信息 当我打开水豚屏幕截图时 我只看到 内部服务器错误 未定义的方法name对于
  • 如何在ckeditor5中的`a`标签中添加“target”属性?

    我已经创建了自己的链接插件 现在我想添加一些其他属性a插件生成的标签 例如target rel 但我无法完成它 这是我的转换器插件代码 我应该添加哪些转换器以便a标签可以支持其他属性吗 license Copyright c 2003 20
  • C++ WinAPI 后台窗口截图

    我想截取没有焦点的窗口的屏幕截图 我的功能适用于某些窗口 但不适用于所有窗口 我不知道为什么 我尝试用它来捕获 Bluestacks App Player 的窗口 效果非常好 但对于 Nox App Player 和其他一些游戏来说 它根本
  • 简化具有重复关联类型限制的 where 子句

    我编写了以下函数来对迭代器求和 use std ops Add fn sum iter i s I init I Item gt I Item where I Iterator Clone i Item Add i i
  • Solr 字段崩溃

    I read http wiki apache org solr FieldCollapsing http wiki apache org solr FieldCollapsing 我尝试了查询 我并没有看到这个领域崩溃 我的意思是我看到了
  • SSRS 的自动化部署选项

    我的任务是研究如何自动化 SSRS 2012 报告的部署过程 有什么好的工具吗 我正在考虑类似按一个按钮 报告就会被部署的事情 Thanks 为了部署我们的 SSRS 报告 我们使用这个可爱的 powershell 项目 https git
  • std::reference_wrapper 和简单指针有什么区别?

    为什么需要有std reference wrapper http en cppreference com w cpp utility functional reference wrapper 应该用在哪里 它与简单的指针有什么不同 它的性能
  • 反应本机相机胶卷

    没有注意到太多关于如何使用 React Native 中的 CameraRoll 库的示例代码 指南 我发现文档中的示例有点 模糊 且令人困惑 我第一次使用任何 API 所以我也不完全理解我应该如何使用该库 到目前为止 我已经将其导入为 i
  • VBA,如果字符串包含某个字母

    我通常不与VBA我无法弄清楚这一点 我试图确定电子表格上的字符串中是否包含某个字母 Private Sub CommandButton1 Click Dim myString As String RowCount WorksheetFunc
  • 为什么 Chrome 无法检查 Docker 容器中的 NodeJS 代码?

    我尝试在 Docker 容器内启动简单的 NodeJS 服务器并使用 chrome inspect 或 WebStorm 对其进行调试 调试端口9229已绑定但检查不起作用 另一方面 当我在没有 docker 的情况下运行相同的代码时 我可
  • 使用 jsPDF rtl 支持将 Html 转为 pdf

    我正在尝试使用 Angular 5 将 html 转换为 pdf这是我的代码 import as jsPDF from jspdf htmlToPdf var doc new jsPDF var specialElementHandlers
  • 从多对多关系续集中选择

    我尝试从一个表中选择并引用另一个表 我在餐桌食品和餐桌配料之间存在多对多的关系 食品型号 module exports function sequelize DataTypes return sequelize define food id
  • 多次读取 Option<&mut T> 的引用

    我有一个Option lt mut T gt 并且想要多次访问包含的引用 如下所示 fn f a Option lt mut i32 gt if let Some x a x 6 if let Some x a x 7 fn main le