无法返回字符串切片向量:借用的值寿命不够长

2023-11-25

我是 Rust 新手,在借用检查器方面遇到了一些问题。我不明白为什么这段代码无法编译。抱歉,如果这与之前回答的问题很接近,但我似乎无法在我看过的其他问题中找到解决方案。

我理解相似之处但在这种情况下,它只是返回一个字符串,不足以让我对我试图返回向量的代码进行推理。据我了解,我正在尝试返回对str类型将超出功能块末尾的范围,因此我应该映射该向量&str转化为一个向量String?我不太关心转换对性能的影响&str to String。首先我想让它正常工作。

这是代码,错误在lex功能。

use std::io::prelude::*;
use std::fs::File;
use std::env;

fn open(mut s: &mut String, filename: &String) {
    let mut f = match File::open(&filename) {
        Err(_) => panic!("Couldn't open file"),
        Ok(file) => file,
    };
    match f.read_to_string(&mut s) {
        Err(_) => panic!("Couldn't read file"),
        Ok(_) => println!("File read successfully"),
    };

}

fn lex(s: &String) -> Vec<&str> {
    let token_string: String = s.replace("(", " ( ")
        .replace(")", " ) ");

    let token_list: Vec<&str> = token_string.split_whitespace()
        .collect();
    token_list
}

fn main() {
    let args: Vec<_> = env::args().collect();
    if args.len() < 2 {
        panic!("Please provide a filename");
    } else {
        let ref filename = args[1];

        let mut s = String::new();
        open(&mut s, filename);
        let token_list: Vec<&str> = lex(&s);
        println!("{:?}", token_list);
    }
}

这是错误消息

error: borrowed value does not live long enough
        self.0.borrow().values.get(idx)
        ^~~~~~~~~~~~~~~
reference must be valid for the anonymous lifetime #1 defined on the block at 23:54...
    pub fn value(&self, idx: usize) -> Option<&Value> {
                                                      ^
note: ...but borrowed value is only valid for the block at 23:54
    pub fn value(&self, idx: usize) -> Option<&Value> {
                                                      ^

我发现很难对这段代码进行推理,因为以我的 Rust 经验水平,我无法想象这些变量的生命周期。任何帮助将不胜感激,因为我花了一两个小时试图解决这个问题。


问题是你正在分配一个新的String (token_string) 在 - 的里面lex函数,然后返回对其的引用数组,但是token_string一旦它在函数结束时超出范围,就会被删除(并释放内存)。

fn lex(s: &String) -> Vec<&str> {
    let token_string: String = s.replace("(", " ( ") // <-- new String allocated 
        .replace(")", " ) "); 

    let token_list: Vec<&str> = token_string.split_whitespace()
        .collect();
    token_list // <-- this is just an array of wide pointers into token_string
} // <-- token_string gets freed here, so the returned pointers
  //     would be pointing to memory that's already been dropped!

有几种方法可以解决这个问题。一种是强迫调用者lex传入要用于收集的缓冲区。这会将签名更改为fn lex<'a>(input: &String, buffer: &'a mut String) -> Vec<&'a str>该签名将指定返回的生命周期&strs 至少与传入缓冲区的生命周期一样长。

另一种方法是只返回一个Vec<String>代替Vec<&str>如果您可以忍受额外的分配。

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

无法返回字符串切片向量:借用的值寿命不够长 的相关文章

随机推荐

  • 烧瓶创建应用程序和设置单元测试

    所以我用这种方式设置了我的烧瓶 def create app config name app Flask name static folder designs UI template folder designs UI instance r
  • jQuery:查找部分类名[重复]

    这个问题在这里已经有答案了 我想看看是否 li 有一个特定的类 但问题是它们都是唯一的 但都包含一个常量字符串 unqID 我想检查一下是否 li li 有一个包含该字符串的类 如果不存在 则将新类添加到 li li 我知道如何查找元素是否
  • 如何调整 的宽度?

    我使用宽度属性作为 对于所有列 但在显示中 列没有调整 我可以通过这种方式进入吗 如果 请指导我实现我想要的列宽 您必须使用columnClasses属性并用逗号 分隔每个列样式 下面的代码示例展示了如何使用columnClassess属性
  • R--在字符串中添加前导零,没有固定的字符串格式

    我有一个专栏如下 9453 55489 4588 18893 4457 2339 45489HQ 7833HQ 如果数字少于 5 位 我想添加前导零 然而 有些号码最后有 HQ 有些没有 我确实检查了其他帖子 他们在 HQ 部分没有类似的问
  • 实体框架连接字符串问题

    我正在制作一个小库 DLL 来管理用户及其角色 权限 计划是能够将此 dll 添加到 MVC 项目中并能够操作用户 角色等 所有数据都驻留在 SQL 数据库中 我正在使用实体框架进行数据访问 因此 当我初始化一个新的 RoleManager
  • Convert.ToInt32 和 (int) 有什么区别?

    以下代码会引发编译时错误 例如 无法将类型 string 转换为 int string name Session name1 ToString int i int name 而下面的代码可以成功编译并执行 string name Sessi
  • C - 并行执行 fork() 时 wait(NULL) 的含义

    在下面的代码中 分叉实际上是并行运行还是一个接一个地运行 是什么意思wait NULL 程序创建 n 个子进程 n 通过命令行提供 int main int argc char argv int i pid for i 0 i lt ato
  • 在“www.foo.com”页面上,从“www.example.com”加载的脚本可以向“www.example.com”发送ajax请求吗?

    这是否受到跨域策略的限制 你不能 您只能将请求发送至www foo com
  • Windows 上的 python psutil 拒绝访问

    操作系统 windows专业版 我正在尝试使用 psutil 获取进程列表及其 CPU 使用情况 我以管理员身份运行脚本 但在遇到进程 DymoPnpService exe 时失败 可能是什么问题 import psutil def pro
  • 空派生优化

    大多数 C 程序员都知道空基类优化是一种技术 idiom 空的子班级会发生什么 例如 class EmptyBase int i template
  • C语言中如何对函数进行排序? “函数的先前隐式声明位于此处”错误

    我确信以前有人问过这个问题 但我找不到任何对我有帮助的东西 我有一个带有 C 函数的程序 如下所示 function2 function1 function1 function2 main function1 它比这更复杂 但我正在使用递归
  • 有没有人使用 Microsoft UI Automation 成功实施 UI 测试自动化制度?

    我正在寻找自动化 UI 测试框架 软件工具 过去我一直在使用测试完成 虽然它是一个很好的软件 但是 GUI 测试自动化的概念被认为是足够困难的 所以我写了一些帖子 to complain about it 第三方测试自动化工具的问题之一是您
  • Rails Passenger Glyphicon CORS Cloudfront NGINX 问题

    所以我知道 stackoverflow 上有关于 CORS Nginx Cloudfront 和 Heroku 的这些问题 但由于某种原因我无法让它工作 我一直在关注这个问题的答案 如何使用 Rails nginx 和乘客配置 Access
  • 使用 PostgreSQL 在 Vapor 3 中上传图像

    我正在关注这些人马丁 拉塞克教程 现在我处于 图像上传 似乎没有人能回答 Vapor 3 如何上传图片 这个问题 数据库连接正常 所有其他值均已保存 这是我的创建方法 func create req Request throws gt Fu
  • validates_inclusion_of 在 Rails 4.1 中不再工作?

    以下代码确保time zone选择的时区范围内ActiveSupport TimeZone us zones validates inclusion of time zone in ActiveSupport TimeZone zones
  • Django:服务器退出时如何运行函数?

    我正在编写一个 Django 项目 其中使用 Popen 打开多个进程 现在 当服务器退出时 这些进程就会被孤立 我有一个函数来终止这些进程 我希望对其进行组织 以便在服务器退出时自动调用该函数 任何帮助将不胜感激 由于您尚未指定正在使用哪
  • 内容范围和范围标头之间的区别?

    HTTP 标头有什么区别Content Range and Range 每种应该什么时候使用 我正在尝试从特定字节偏移量流式传输音频文件 我应该使用Content Range or Range header 事实上 接受的答案并不完整 Co
  • 已删除InDjango19警告:模型未声明显式 app_label

    已经经历过 Django 1 9 弃用警告 app label 但答案无法解决我的问题 所以再次询问 我有一个应用程序已添加到设置中的 INSTALLED APPS 中 每当我跑步时manage py runserver 我收到这个警告 t
  • python请求:发布和大内容

    我正在使用 POST 请求将 CSV 文件发送到服务器 我正在使用类似文件的对象requests post 如果 CSV 文件很大并且我的内存有限 或者我使用类似文件的对象永远不会将整个文件加载到内存中 是否会出现问题 我对此不太确定 我知
  • 无法返回字符串切片向量:借用的值寿命不够长

    我是 Rust 新手 在借用检查器方面遇到了一些问题 我不明白为什么这段代码无法编译 抱歉 如果这与之前回答的问题很接近 但我似乎无法在我看过的其他问题中找到解决方案 我理解相似之处但在这种情况下 它只是返回一个字符串 不足以让我对我试图返