匹配时如何不借用期权?

2024-01-12

我有以下代码:

fn remove_descendent(&mut self, key: &K) -> Option<V> {
    if self.left.is_some() && self.left.as_ref().unwrap().key == *key {
        return self.remove_left();
    }

    // more of the function
}

这对我来说感觉很恶心。而不是检查is_some然后打开包装。我认为我真正应该做的是使用 match 语句来解构Option代表为left像这样的变量:

fn remove_descendent(&mut self, key: &K) -> Option<V> {
    match self.left {
        Some(ref left) if left.key == *key => self.remove_left(),
        _ => None
    }

但是,当我这样做时,我收到以下错误:

error[E0502]: cannot borrow `*self` as mutable because `self.left.0` is also borrowed as immutable
  --> src/lib.rs:29:51
   |
29 |             Some(ref left) if left.key == *key => self.remove_left(),
   |                  --------                         ^^^^ mutable borrow occurs here
   |                  |
   |                  immutable borrow occurs here
30 |             _ => None
31 |         }
   |         - immutable borrow ends here

我想我知道我不能一成不变地借用结构成员,然后可变地借用该结构。但如果是这样的话,模式匹配我的正确方法是什么Option?有吗?


编译器会抱怨,因为在匹配臂中self还是借的。您可以通过克隆来解决这个问题key预先:

fn remove_descendent(&mut self, key: &K) -> Option<V> {
    match self.left.clone() {
        Some(ref left) if left.key == *key => self.remove_left(),
        _ => None,
    }
}

你可以看到它的实际效果.

With 非词汇生命周期 https://github.com/rust-lang/rust-roadmap/issues/16启用后,您的代码可以正常编译:.

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

匹配时如何不借用期权? 的相关文章

随机推荐

  • 将徽章添加到选项卡

    如何向选项卡添加徽章 我正在使用这个代码 protected void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView
  • 如何更改作为参数传递的变量的值?

    如何更改 C 中作为参数传递的变量的值 我试过这个 void foo char foo int baa if baa foo ab else foo cb 并致电 char x baa foo x 1 printf s n x 但它打印ba
  • 如何在 Netbeans 平台上获取项目类型?

    有没有办法知道所选项目的类型 我想根据项目类型 如 J2SE 项目 执行一些特定操作 以下是我发现的唯一方法 public final class MyAction extends CookieAction Override public
  • 如何从 JavaScript 中的 foreach 循环中删除特定数组元素

    var fruit apple pear pear pear banana 如何从该数组中删除所有 梨 水果 我尝试了以下方法 但仍然留下一个梨 for var f in fruit if fruit f pear fruit splice
  • 动态添加边缘 visjs

    谁能帮我在这个 visjs 网络中动态添加边 实际上 我正在尝试使用拖放将节点添加到画布 但是当我单击节点并将边缘动态添加到画布上现有的另一个节点时 我需要帮助添加边缘 您可以使用 vis js 的 更新 函数动态添加节点或边 您只需传入一
  • 禁用 WebAPI 的 Windows 身份验证

    我正在使用 MVC4 应用程序并使用 WebAPI 来获取 发送我的所有数据 在控制器中 我使用 HttpClient 请求来获取数据 一切正常 我面临的问题是 当在项目中启用 Windows 身份验证时 Web API 调用将返回 401
  • 如何解决错误: getSharedPreferences(String, int) 对于 new View.OnClickListener(){} 类型未定义

    我在编码中遇到此错误 但不完全确定如何解决此问题 我已经尝试尝试解决此问题 但似乎找不到任何有效的方法 我以前做过这个 但从来没有在片段中做过 所以也许是因为这个 我正在关注exception new View OnClickListene
  • 如何在无服务器框架中为多个 dynamodb 表定义 iamrolestatements 资源?

    我想在我的无服务器项目中使用多个 dynamodb 表 如何在 iamrolestatements 中正确定义多个资源 我有一个例子serverless yml service serverless expense tracker fram
  • 作为隐藏类加载时,Lambda 表达式和匿名类不起作用

    我正在尝试在运行时编译和加载动态生成的 Java 代码 由于 ClassLoader defineClass 和 Unsafe defineAnonymousClass 在这种情况下都有严重的缺点 我尝试使用隐藏类 https openjd
  • 壶 '?'不工作表输入步骤

    我想从数据库中获取所有表名 然后从表中获取所有行 所以我创建了这样的转换 获取表名称 添加数据库连接并将表名称存储在名为 tablename 的输出字段中 表输入 标记为 替换脚本中的变量 和 对每行执行 添加了 从步骤插入数据 中的第一步
  • Pickling cv2.KeyPoint 会导致 PicklingError

    我想搜索给定目录中所有图像中的冲浪并保存它们的关键点和描述符以供将来使用 我决定使用pickle 如下所示 usr bin env python import os import pickle import cv2 class Frame
  • 如何在 html 中使用纯 javascript 切换类

    我有一个 div 我想在悬停时切换它的类 这是我的代码 function a this classList toggle first this classList toggle sec document querySelector cont
  • 如何将 R 历史记录中指定行数保存到文件中?

    这有点令人沮丧 但我确信有一个简单的答案 history max show N 将在终端上显示 N 行历史记录 savehistory file 将根据某些环境变量将多行历史记录保存到文件中 我想做的是 savehistory file m
  • 如何在Python中使用paramiko库发送箭头键?

    我正在使用 python 2 7 和代码 ssh 客户端paramiko图书馆 我用myhost channel send chr keycode 将每个键码发送到服务器 但它仅适用于 1 字节键码 我想发送其他多字节键码 例如箭头键 我怎
  • 在 Android 网页中禁用输入焦点缩放

    这是一个困境 我有一个网页 仅适用于 Android 设备 在该页面中我有一个输入框 特别是文本框 当它获得焦点时 浏览器会放大 我不希望它放大 声音容易 对吧 这就是有趣的地方 我必须能够总体缩放 所以不要说 那对我不起作用 另外 输入框
  • 控制反转和 RAII 可以一起发挥作用吗?

    我刚刚阅读了有关控制反转 IOC 的内容 这让我很困扰 它似乎让内存管理变得很痛苦 当然 ioc 似乎主要用于垃圾收集环境 Net Java Scripting 而我关心的是非 gc 设置 我在这里担心的是 IOC 在某种程度上违背了 RA
  • 检查链表的循环性[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要一个方法 该方法将链表作为参数
  • Facebook 页面嵌入不适用于任何浏览器中的 iFrame

    当我尝试使用嵌入 Facebook 页面时出现错误Facebook Page Plugin https developers facebook com docs plugins page plugin https developers fa
  • 直接下载 OneDrive 文件的链接吗?

    OneDrive 可共享链接如下所示 https 1drv ms w s AqmFiI7maXrRgT7PGcK 7JyZlBco https 1drv ms w s AqmFiI7maXrRgT7PGcK 7JyZlBco 如何获得此版本
  • 匹配时如何不借用期权?

    我有以下代码 fn remove descendent mut self key K gt Option