为什么 rust 'pub fn func(&'a mut self)' 在运行后被认为是“可变借用”?

2024-04-27

tl;dr given pub fn func(&'a mut self), 为什么是self被认为是“可变借用”after func已经跑了?

给出以下最小可行示例()

pub struct Struct1<'a> {
    var: &'a u8,
}

impl<'a> Struct1<'a> {
    pub fn new() -> Struct1<'a> {
        return Struct1 {
            var: &33,
        }
    }
    pub fn func(&'a mut self) -> () {
        ()
    }
}

fn main() {
    let mut s1 = Struct1::new();
    s1.func();  // point 1
                // point 2
    s1.func();  // point 3
}

导致编译器错误

error[E0499]: cannot borrow `s1` as mutable more than once at a time
  --> src/test12-borrow-mut-struct-twice-okay.rs:20:5
   |
18 |     s1.func();  // point 1
   |     -- first mutable borrow occurs here
19 |                 // point 2
20 |     s1.func();  // point 3
   |     ^^
   |     |
   |     second mutable borrow occurs here
   |     first borrow later used here

然而,在// point 2 the s1 在我看来不再被借用。这func运行完毕。还可以借什么self within func!?它出现func at //point 1已放弃控制权s1.

还借什么s1 at // point 3 ?


类似问题:

  • 多次借用的借用错误 https://stackoverflow.com/questions/40165686/borrow-errors-for-multiple-borrows
  • 从哈希图或 vec 返回引用会导致借用到最后一个 https://stackoverflow.com/questions/38023871/returning-a-reference-from-a-hashmap-or-vec-causes-a-borrow-to-last-beyond-the-s
  • 神秘借用范围扩展 https://stackoverflow.com/questions/32151937/mysterious-borrow-scope-extension
  • 借用者范围结束时无法借用变量 https://stackoverflow.com/questions/38713228/cannot-borrow-variable-when-borrower-scope-ends
  • 为什么这个可变的借用超出了它的范围 https://stackoverflow.com/questions/66252831/why-does-this-mutable-borrow-live-beyond-its-scope)
  • 可变借用似乎超出了其范围 https://stackoverflow.com/questions/32403837/mutable-borrow-seems-to-outlive-its-scope

// 在第 3 点仍然借用 s1 的是什么?

你告诉编译器它仍然是借用的,所以它信任你:虽然编译器验证你的生命周期不是太短,但它并不真正关心它们是否太长而导致东西无法使用。

当你写的时候&'a mut self, the 'a是在impl块,因此是在结构上定义的块。&'a mut self :

self: &'a mut Struct1<'a>

所以一旦你打电话func()rust 编译器会说“好吧,这是借来的'a这是与相关的生命周期s1这是'static,所以这是可变地永远借用的,美好的一天”,因此你被“锁定”在结构之外。

事实上,您可以通过尝试显式声明一个来看到此别名'a on func:

    pub fn func<'a>(&'a mut self) -> () {
        ()
    }
error[E0496]: lifetime name `'a` shadows a lifetime name that is already in scope
  --> src/main.rs:11:17
   |
5  | impl<'a> Struct1<'a> {
   |      -- first declared here
...
11 |     pub fn func<'a>(&'a mut self) -> () {
   |                 ^^ lifetime `'a` already in scope

error: aborting due to previous error

所以 Rust 毫不含糊地告诉你,在区块内'a始终指的是声明的生命周期impl block.

解决办法就是直接删除'a,这完全是错误的生命周期:

    pub fn func(&mut self) -> () {
        ()
    }

在这种情况下,rustc 将自动引入生命周期,并且由于该函数实际上并没有借用任何东西,因此生命周期只会扩展到函数调用。

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

为什么 rust 'pub fn func(&'a mut self)' 在运行后被认为是“可变借用”? 的相关文章

随机推荐

  • 简单的 XML 加载文件不起作用

    为什么这不起作用 url http query yahooapis com v1 public yql q select 20 20from 20html 20where 20xpath 3D 22 2F 2Fmeta 22 20and 2
  • Docker nuget连接超时

    尝试利用官方jetbrains teamcity agentKubernetes 上的图像 我已经设法在 Docker 中运行 Docker 但尝试使用以下命令构建 ASP NET Core 映像docker build命令失败于dotne
  • SetLocale 无法在 jsp 站点中以德语格式化货币

    我对 jstl 标签库感到困惑 我想将数字格式化为德国风格的货币 但我尝试的一切都不起作用 我找到了以下示例 但输出是相同的
  • 如何根据 angular.js 中的子复选框选择父复选框?

    我最近一直在使用 Angular js 并决定在选中父复选框后检查所有复选框 我已经使用了ng model and ng checked指令 div div div div
  • Hibernate 本机查询:无效的列名错误 SQL-17006

    package com abc def model import javax persistence Column import javax persistence Id import javax persistence Entity im
  • 在Angular JS中通过ajax调用发送数组

    我使用以下代码将一些信息发送到我的 servlet 来处理数据 http method GET url http localhost 8080 purchase AddInfo data addArray sample success fu
  • “for_each”值取决于无法确定的资源属性(Terraform)

    我有一个 terraform 配置 需要 创建一个 lambda 调用 lambda 迭代 lambda 的 json 结果 返回一个数组并为数组中的每个条目创建一个 CloudWatch 事件规则 相关代码如下 Create lambda
  • PHP GD库用于合并两个图像

    好的 我的文件中有两个图像 其中一件是T恤 另一个是徽标 我使用 CSS 设计了这两个图像的样式 使其看起来像徽标写在 T 恤上 我只是在 CSS 样式表中为徽标图像赋予了更高的 z index 无论如何 我是否可以使用 GD 库生成衬衫图
  • 对 Angular 2 中提供的 @NgModule 感到困惑

    我正在尝试玩 Angular2 当我将基本代码升级到 Angular 2 0 0 RC5 时 我发现引入了一个重大更改 NgModule 它相当于角度模块 在 Angularjs 1 x 中 对我来说 ngModule 让事情变得复杂 当我
  • Jquery Validate:如何忽略占位符文本(默认/空白时产生错误)

    我想让 jquery 验证忽略默认文本 我检查默认文本的方法是检查 element value 元素 alt 文本 这是我的代码 但无论它是空白 默认文本还是任何其他文本 它都会返回无效 validator addMethod notDef
  • 点击Leaflet地图上的点即可在Shiny中生成ggplot

    我正在尝试使用 R 中的 Shiny 创建一个 Leaflet 地图 它允许用户单击任何标记来生成表示该特定站点的信息 温度 的相应图 我合并了这个问题的代码 单击传单地图中的点作为闪亮绘图的输入 https stackoverflow c
  • 主要:并非所有代码路径都会返回值

    我正在制作列表并想在控制台中查看它 我有一个错误 它说 Main 并非所有代码路径都会返回值 也许你可以帮助我 这是我的代码 namespace ConsoleApplication5 public class DocConfig publ
  • C# 控制台应用程序上的退出按钮 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 大家好 我敢打赌我真的很蠢 你能帮我消除这些错误吗 抱歉 我是一名刚刚学习 C 的学生 我需要声明任何变量来纠正逻辑吗 void Windo
  • 位运算 (C++)

    最近面试时遇到一个问题 我被要求比较按位运算的性能 比如 简单描述一下不同位操作的性能 我想这个问题可能非常普遍并且非常特定于机器 但我也认为应该有一些关于这个的一般规则 你必须提到 我没有 那么 你会回答什么 我可能还应该说 比较它们在
  • 使用 javascript 过滤二维数组

    我有一个 2D 数组 我需要过滤具有日期字段 3d 列 的行 var data 1 a 12 12 2019 A 2 b A 3 c 12 1 2019 A 4 d A 预期结果是 result 1 a 12 12 2019 A 3 c 1
  • 用于迭代数据帧行以进行谷歌地图距离查询的 R 代码

    我正在寻求一些帮助 编写一些 R 代码来迭代数据帧中的行 并将每行中的值传递给函数 并将输出打印到 excel 文件 txt 文件或仅在控制台中 这样做的目的是使用此网站上的功能自动对谷歌地图进行一系列距离 时间查询 数百个 http ww
  • 僵尸:使用集成菜单归档失败

    当我尝试直接使用 Xcode 菜单存档项目时 产品 档案 效果很好 但是当我尝试从集成菜单 机器人 执行它时 我收到此错误 构建操作失败 没有指定任何错误 个人打造 任务可能因未知原因而失败 一个可能的原因是如果 有太多 可能是僵尸 进程
  • window.resolveLocalFileSystemURL 与 window.requestFileSystem

    使用上有什么区别window resolveLocalFileSystemURL vs window requestFileSystem使用 cordova 文件插件下载文件时 我找不到有关resolveLocalFileSystemURL
  • 为什么 Decimal.MaxValue - 0.5 的结果是整数?

    今天我在玩小数 我注意到这一点 Decimal MaxValue 79228162514264337593543950335 Decimal MaxValue 0 5m 79228162514264337593543950334 以下代码打
  • 为什么 rust 'pub fn func(&'a mut self)' 在运行后被认为是“可变借用”?

    tl dr given pub fn func a mut self 为什么是self被认为是 可变借用 after func已经跑了 给出以下最小可行示例 pub struct Struct1 lt a gt var a u8 impl