为什么显式生命周期注释会触发双重可变借用错误?

2023-12-05

给出的例子为

fn main() {
    let v = 0u64;

    let mut a = A {
        x: "hello".to_string(),
        y: &v,
    };

    a.hello();
    a.world();
}

struct A<'a> {
    x: String,
    y: &'a u64,
}


impl<'a> A<'a> {
    fn hello(&'a mut self) {
        self.world();

        self.x = "hello123".to_string();

        let _ = *self.y;

        self.world();
    }

    fn world(&mut self) {
        self.x = "world".to_string();
    }
}

构建它会产生错误

   |
9  |     a.hello();
   |     --------- first mutable borrow occurs here
10 |     a.world();
   |     ^^^^^^^^^
   |     |
   |     second mutable borrow occurs here
   |     first borrow later used here

但是,更改签名A::hello(即消除显式的'a注释)到

fn hello(&mut self)

将修复该程序。


问题不在于显式生命周期,而在于使用same可变借用和其中数据的生命周期A。 当我们写出被省略的生命周期时,没有显式注释的版本就变成了

impl<'a> A<'a> {
    fn hello<'b>(&'b mut self) {
        //…
    }
}

通过强迫'a and 'b是相同的(在你的情况下通过重用'a)你告诉编译器借用self应与内部参考文献一样长A并且由于所有引用都存储在A必须比它活得更长久,至少直到A超出范围。 这意味着一旦您致电您的hello的实例A在它的余生中被借用,因为该借用是排他性的,所以你不能在其他地方借用它。

这个问题对于world函数,因为您不会强制其借用内部生命周期。

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

为什么显式生命周期注释会触发双重可变借用错误? 的相关文章

随机推荐

  • 使用neo4j客户端在动态查询中返回多值

    按照我问的问题 使用 neo4j 客户端构建动态查询 我得到了关于如何仅使用字符串动态返回值的答案 当我尝试使用语法从失败的查询中返回多个值时 我尝试了以下查询 var resQuery2 WebApiConfig GraphClient
  • a href 链接不可点击

    我正在构建的网站遇到问题 我有一个菜单 其中包含 2 个列表项链接 称为 默认 和 测试 但在 Firefox 中我无法单击它们 在 IE 中 它们有效 我认为这是页面上项目的 z index 问题 但我无法解决它
  • 如何在Python中修改dbf文件

    假设我在根目录下的一些文件夹中有不同数量的dbf文件 d myfolder dbf 文件的内容如下所示 Field1 11110481123 12150480021 我想添加一个字段 例如 Field1 仅包含值的最后 4 位Field2
  • 通过 Gmail 在 .NET 中发送电子邮件

    我没有依赖我的主机发送电子邮件 而是考虑使用我的主机发送电子邮件 Gmail帐户 这些电子邮件是发送给我在节目中演奏的乐队的个性化电子邮件 有可能做到吗 请务必使用System Net Mail 不是已弃用的System Web Mail
  • 如何在猫鼬中填充其他集合的子文档?

    ASchema new mongoose Schema name String B BSchema var BSchema new Schema name String var CSchema new Schema name String
  • 多个错误代码配置web.xml

    我想将所有错误定向到我的 Errorsevlet 而不明确指定所有代码 有什么办法可以这样做吗
  • Scala App Trait 和 main 内部如何工作?

    嗨 我是 Scala 新手 据我所知 在scala中创建入口点有两种方法 一种是用对象定义main方法 另一种是扩展App特征 我想知道如何App特质有效 所以我检查了来源AppTrait 但是里面充满了令人困惑的代码 该代码表示 该应用程
  • 验证 php 表单中的手机号码

    我想验证 10 位数字的手机号码 并在输入数据库时 添加前缀 0
  • 中国 Google 地图应使用哪个网址?

    我想加载谷歌地图 JavaScript API 并且我希望可以从内部访问它中国防火墙 Google 推荐 http maps google cn 但如果我使用它 对于世界其他地区的人来说可能会更慢 据我所知 中国的防火墙并没有阻止http
  • 如何确保某人在按下我网站上的“喜欢”按钮时已成功“喜欢”我的网站?

    我正在开发一个rails 3应用程序 它需要一个facebook 喜欢 按钮并显示点击它并完成喜欢过程 登录facebook等 的人的个人资料图片 由于其他原因 我的应用程序需要知道何时 current user已成功喜欢我的网站 例如 如
  • Perl 中如何检查文件是否存在?

    我有一个相对路径 base path input myMock TGZ myMock TGZ是位于输入文件夹中的文件名 文件名可以更改 但路径始终存储在 base path 我需要检查该文件是否存在于 base path 测试是否某物存在于
  • 隐藏具有相同类的所有 div(第一个除外)

    我有 10 个 属于同一类 div class c1 div div class c1 div div class c1 div div class c1 div div class c1 div div class c1 div div
  • MobileFirst OAuth 和注销

    我有一个访问两个适配器的测试应用程序 由引用领域的 SecurityTest 保护的 JavaScript 适配器 一个 Java 适配器 其方法受与同一领域对应的 OAuth 范围保护 如果我遵循这个顺序 一切都会按预期进行 尝试访问 J
  • 在 Windows 服务中模拟用户

    我正在尝试使用以本地系统帐户登录的服务来模拟 Windows 服务中的域用户 到目前为止 我只能通过记录服务并使用用户凭据设置进程来使其工作 如下所示 ProcessStartInfo startInfo new ProcessStartI
  • SwiftUI ForEach 刷新使视图弹出

    我有这样的事情 import SwiftUI struct Overview View ObservedObject var firstArray FirstArray var body some View Group ScrollView
  • 在 C# 中解析 C 头文件

    我正在使用 Visual Studio C 我需要解析 C 头文件以仅提取有关其中包含的函数声明的信息 对于每个函数 我需要名称 返回类型及其参数 如果可能的话 我希望参数按照它们在函数声明中出现的顺序排列 我在网上看到过有关使用 Visu
  • Angular2:ng2-file-upload:无法使用 SystemJS 正确加载它

    我正在使用 systemJS 来管理我的包 因此我已将这些行添加到我的 systemjs 的配置文件中 map ng2 file upload node modules ng2 file upload packages ng2 file u
  • 有没有一个好的 IDE 可以用 Python 构建 GUI 应用程序 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我是一名初学者程序员 在过去的几个月里 我通过使用 delphi 学到了迄今为 止所知道的大部分知识 大约一个月前 我决定尝试一下 python 因
  • Android Gallery(查看)视频(还有缩略图问题)

    目前我们有一个图库视图 我们需要向其中添加图像 视频的缩略图 如果我们已经有了图像 视频的 content URI 我们如何获取已经生成的缩略图 本机图库应用程序显示的缩略图 我们使用的是Android 1 6 Video Thumbnai
  • 为什么显式生命周期注释会触发双重可变借用错误?

    给出的例子为 fn main let v 0u64 let mut a A x hello to string y v a hello a world struct A lt a gt x String y a u64 impl lt a