在同一函数中多次使用 self

2023-12-10

我与借用检查员发生争执。我的问题有点复杂,但对于这种情况,我使用类似缓冲区的结构。我的缓冲区有一个功能safe_write_to_slot首先检索第一个空元素(返回 Ok(位置)或 Err(错误消息)结果),然后将值写入该检索到的位置。然而问题是,当我将检索到的位置分配给值时,rust 抱怨我在几行后再次重用 self 。如何首先调用返回结果的 (self) 函数,然后继续使用 self 执行某些操作?

use std::result::Result;

struct Elems {
    pub elems : Vec<int>,
}

impl Elems {
    pub fn new() -> Elems {
        Elems{elems: vec![0,0,0,0,0,0]}
    }

    pub fn safe_write_to_slot(&mut self, elem : uint) -> Result<(), &str> {
        let loc = try!(self.get_slot());

        self.unsafe_write_to_slot(loc);

        Ok(())
    }

    pub fn get_slot(&self) -> Result<uint, &str>{
        let mut loc = -1i;

        for x in range(0, self.elems.len()) {
            if *self.elems.get(x) == 0 {
                loc = x as int;
            }
        }

        if loc != -1 { Ok(loc as uint) } else { Err("No free slots") }
    }

    fn unsafe_write_to_slot(&mut self, elem : uint) {
        self.elems[elem] = 1;
    }
}

我得到的错误是:

   Compiling borrow v0.0.1 (file:///borrow)
main.rs:19:9: 19:13 error: cannot borrow `*self` as mutable because it is also borrowed as immutable
main.rs:19         self.unsafe_write_to_slot(loc);
                   ^~~~
main.rs:17:24: 17:28 note: previous borrow of `*self` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `*self` until the borrow ends
main.rs:17         let loc = try!(self.get_slot());
                                  ^~~~
/main.rs:17:19: 17:41 note: expansion site
main.rs:22:6: 22:6 note: previous borrow ends here
main.rs:16     pub fn safe_write_to_slot(&mut self, elem : uint) -> Result<(), &str> {
/main.rs:22     }
               ^
main.rs:37:9: 37:29 error: cannot assign to immutable dereference (dereference is implicit, due to indexing)
main.rs:37         self.elems[elem] = 1;
                   ^~~~~~~~~~~~~~~~~~~~
error: aborting due to 2 previous errors
Could not compile `borrow`.

To learn more, run the command again with --verbose.

终身推断导致了这里的问题。

The get_slot方法解释为:

pub fn get_slot<'a>(&'a self) -> Result<uint, &'a str> {

结果与以下内容具有相同的生命周期:self, 什么导致self保持冻结状态,直到结果被丢弃。但是,您不想链接self to &str,因为您只返回字符串文字。通过改变&str to &'static str in get_slot and safe_write_to_slot,您将不会再收到错误,因为self调用时将不再被视为借用unsafe_write_to_slot.

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

在同一函数中多次使用 self 的相关文章

随机推荐

  • Redshift UDF逻辑问题

    我正在尝试编写 redshift udf 来验证时间戳 但是 它总是返回 false 有人可以解释一下为什么吗 create or replace function f Is timestamp sql VARCHAR 20000 retu
  • 如何使用 Interop 与 C# 将 *.ppt、*.pptx 文件另存为 *.wmv?

    我尝试用下面的代码来做到这一点 using Microsoft Office Core using PowerPoint Microsoft Office Interop PowerPoint using System IO using M
  • 如何使用 Java SDK 获取 AWS Quicksight 仪表板的嵌入 URL

    我想我了解获取 AWS Quicksight 仪表板的嵌入 URL 所需的所有步骤 并且我已经能够通过 AWS CLI 获取有效的 URL 如AWS docs 但是 我似乎无法通过 AWS Java SDK 特别是 v2 让它工作 似乎任何
  • 如何让Android应用程序在屏幕休眠时在后台运行?

    我正在开发一个跟踪应用程序 它通过每 3 秒获取用户当前位置来跟踪用户 当屏幕打开时 我能够获取经纬度值 但当屏幕休眠时 我无法获取数据 CODE Override public void onLocationChanged Locatio
  • 在VS 2017、MVC中添加服务引用

    如何在 VS 2017 MVC 中添加服务引用 我尝试找到 添加服务引用 按钮 但它不在那里 只有 添加引用 和 添加连接的服务 我之前在 VS 2013 中添加了服务引用 这很容易 但现在我为我的学校项目更改为 VS 2017 我不知道如
  • 使用 Gson 或 Jackson 压平 JSON 字符串,将包含各个级别键值的键制作为 Map

    我有一个关于以下问题的增强问题使用 Gson 或 Jackson 将 JSON 字符串展平为 Map 我的场景包括重复的键 因此上述问题中的解决方案会导致一些重复的键被覆盖 所以我正在考虑通过将每个级别的密钥组合在一起来构造密钥 那么如何实
  • 如果主题更改,请更改 WP7 应用程序的背景

    如果用户更改主题 我需要更改应用程序的背景图像 Light to Dark 或在代码隐藏中反之亦然 我希望这些应该在页面已加载 event TimDams 向您指出了检测现在设置的主题的好方法之一 但我没有注意到有任何信息如何检测a cha
  • MobileFirst Starter - Bluemix 推送通知在生产模式下失败

    我正在构建一个可以通过 Bluemix 接收远程通知的 iOS 应用程序 我在 Xcode 中的应用程序包标识符与 Apple Portal 中的 AppId 相匹配 后者也与 APN 证书相匹配 xxx sandbox p12 和 xxx
  • 如何更改构建定义的 Scala 版本?

    我正在开发一个简单的 SBT 项目 其中包括用于对 Scala 并行集合进行基准测试的 InputTasks 当我遇到问题时 我已经定义了输入键并开始编写任务 由于我的基准要求斯卡拉 2 10 0 M5 我尝试在我的build sbt na
  • 返回匿名类型结果?

    使用下面的简单示例 使用 Linq to SQL 从多个表返回结果的最佳方法是什么 假设我有两张表 Dogs Name Age BreedId Breeds BreedId BreedName 我想把所有的狗都带回来BreedName 我应
  • EL中bean的动态选择

    有没有办法在运行时而不是设计时指定 EL 中使用的托管 bean 例如 actionListener myBean method 这样myBean根据调用代码的 JSF 页面 part 可以有不同的值 条件是使用的任何对象代替 myBean
  • 只在 ISR 中读取的变量是否为 易失性?

    Is volatile需要一个在主循环中读写但在 ISR 中只读的变量吗 编辑 在编写 main 时 ISR 被禁用 因此 该变量被有效地原子地使用 EDIT 非常相关 中断的易失性与内存屏障 volatile是一种不好的同步访问方式 这是
  • jQuery:将复选框的值添加到输入文本字段

    我正在尝试将任何选中的复选框的值添加到输入文本字段 这是我的小提琴 http jsfiddle net Lf6ky document ready function checkbox on click function if checkbox
  • 使用 f String 插入字符或符号@

    我有两个变量总共存储两个数字 我想组合这些数字并用逗号分隔它们 我读到我可以使用 variablename 插入加号或空格或零 但逗号不起作用 x 42 y 73 print f the number is x y 这是我奇怪的解决方案 我
  • Qt 库中控件的默认 HTML 样式

    这是一个关于 Qt 库的问题 而不是关于 Web 设计的问题 对于 QLabel 和其他控件 我可以设置 HTML 文本 例如 Some Text 问题是 默认的HTML样式是在哪里定义的 我如何找出 标签将使用什么字体 下一个问题 我可以
  • 接收有关 Reality Composer 动画结束的 Xcode 通知

    我有以下可以正确加载的 Reality Composer 项目 正如您所看到的 当动画完成时 它应该使用关键字 attackComplete 进行通知 我如何收到此通知 import RealityKit import ARKit clas
  • 从 1:n 表中的单个查询中检索最新注释(按时间戳)

    假设我有两个表 用户和注释 假设架构如下所示 users id name field2 field3 notes id user id subject heading body timestamp 我想要做的是选择每个用户 以及每个用户根据
  • 如何避免在 .NET Windows 窗体中重复创建表单?

    我正在使用 NET Windows 窗体 我的 MDI 父窗体包含菜单 如果单击菜单 将显示表单 到现在为止没有问题 UserForm uf new UserForm uf Show uf MdiParent this 如果我再次单击菜单
  • Paho MQTT 客户端在设备锁定后断开连接

    我目前正在开发一个小型 紧急按钮 应用程序 该应用程序应该在医疗机构中运行 由于该项目的假设之一是独立于 Internet 因此我决定采用 MQTT 并在本地 WLAN 中设置服务器 我已经实现了 Paho Android 服务 效果非常好
  • 在同一函数中多次使用 self

    我与借用检查员发生争执 我的问题有点复杂 但对于这种情况 我使用类似缓冲区的结构 我的缓冲区有一个功能safe write to slot首先检索第一个空元素 返回 Ok 位置 或 Err 错误消息 结果 然后将值写入该检索到的位置 然而问