为什么变量的寿命不够长?

2023-11-26

考虑这个函数,它应该返回给定的文件扩展名Path.

pub fn get_extension<'a>(path: &'a Path) -> Option<&'a str> {
    let path_str = path.as_str().unwrap();
    let ext_pos = regex!(".[a-z0-9]+$").find(path_str);

    match ext_pos {
        Some((start, _)) => {
            return Some(path_str.as_slice().slice_from(start))
        },
        None => return None
    }
}

错误信息如下:

`path_str` does not live long enough

enter image description here

错误消息非常清楚,遗憾的是我无法自己解决它。我在理论上理解它,但对我来说仍然有一些模糊的事情。

我知道编译器想告诉我path_str生命周期不够长,无法有效,因为返回值被标记为生命周期'a.

但这对我来说就停止了:

  • 据我了解,参考path(输入参数)的寿命应该与对str被包裹在Option(输出参数)

  • 自从我们回来Some(path_str.as_slice().slice_from(start))我认为在实践中这意味着path_str需要活多久path.

我不明白的是到底为什么 does path_str活得不够长,我该如何解决这个问题?是什么让它很快死去?

UPDATE

正如评论和 IRC 中指出的,删除了多余的内容as_slice()使代码编译。有谁知道这是为什么?也有人指出,存在一个method直接获取扩展名。但是,是的,我实际上更感兴趣的是了解问题背后的故事。


这不是一个错误。这里的“问题”是as_slice的定义。它需要对其参数的引用,并返回一个&str与相同的寿命参考,它无法内省所调用的任何类型的内部生命周期。那是,path_str.as_slice()返回一个&str持续时间只要path_str, not只要数据path_str指向(原来的Path).

换句话说,这里有两辈子。我将在 @Arjan 的示例中使用假设的块生命周期注释语法提交错误(这个答案是基于我的回应).

fn test<'a>(s: &'a String) -> &'a str {
    'b: {
        let slice: &'a str = s.as_slice();
        slice.as_slice()
    }
}

对于第二个as_slice打电话给我们self: &'b &'a str,因此它返回&'b str,太短了:'b只是本地的test.


正如您所发现的,现在的修复只是删除无关的as_slice称呼。然而,随着动态调整大小的类型 (DST),我们将能够写出impl StrSlice for str, 进而slice.as_slice() will正在返回一个&'a str,因为不会有额外的引用层(即self: &'a str).

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

为什么变量的寿命不够长? 的相关文章

随机推荐

  • 无法从 Google Cloud Function 访问存储在 Secrets Manager 中的密钥

    在测试我编写的尝试访问存储在 Secret Manager 中的密钥的 Google Cloud Function 时 出现以下错误 Error 7 PERMISSION DENIED Permission secretmanager ve
  • Swift 1.2 中的神秘崩溃 - 仅在发布版本中

    更新到 Xcode 6 3 beta 1 和 Swift 1 2 后 我的所有应用程序都神秘崩溃仅在发布版本中 在更新我的 Swift 1 2 代码后 它们在调试版本中工作正常 调试器没有任何感觉where崩溃正在发生 但原因尚不清楚 一些
  • jQuery点击表格单元格事件

    我有一个如下所示的html代码 tbody tr td class name Joe td td class surname White td td class age 25 td tr tbody 并且有这样的 jQuery 代码 tr
  • 有没有更好的方法用 Python 编写这个 URL 操作?

    我很好奇是否有一种更简单的方法可以从 url 中删除特定参数 我想出的是以下内容 这似乎有点冗长 使用的库或者更Pythonic的版本值得赞赏 parsed urlparse url if parsed query params dict
  • Docker - 如何将文件从映像复制到主机?

    我的问题与这个问题将文件从容器复制到主机 我有一个 Dockerfile 它可以获取依赖项 从源代码编译构建工件并运行可执行文件 我还想复制构建工件 在我的例子中它是 zip由 生产sbt dist在 target 中 但我认为这个问题也适
  • 如何进行视野自动对焦?

    当用户打开页面时 我需要聚焦该字段 我不知道它是否会改变任何东西 但它位于我从 PHP 文件加载的模式窗口内 有简单的方法吗 使用 JavaScript 您可以实现此目的 document onload function document
  • 使用 Jasmine 在 JavaScript 中存根 WebSocket

    我尝试测试是否onmessage是一个适当的函数 这是一个测试 describe init address window function beforeEach function address ws test address window
  • MigLayout 推送 VS 增长

    这两个约束有什么区别 从文档中 PUSH 使组件所在的行和 或列随着 权重 而增长 GROW 设置组件相对于同一单元中的其他组件的增长程度 那么 主要的想法是缩小组件内部和外部的尺寸 重要的是要明白fill 列 行 grow push协同工
  • 当未指定默认命名空间时,函数 getMessageData 必须使用前缀[重复]

    这个问题在这里已经有答案了 我收到这个错误 WEB INF jsp account index jsp 6 0 函数 getMessageData 必须 当未指定默认名称空间时与前缀一起使用
  • 二叉树插入算法

    我最近完成了我正在从事的一个项目的二叉搜索树的实现 一切都很顺利 我学到了很多东西 然而 现在我需要实现一个常规的二叉树 由于某种原因 这让我感到困惑 我正在寻找一种方法来执行我的 InsertNode 功能 通常在 BST 中 您只需检查
  • 动态改变listview的分隔线高度?

    这个问题已被问到这里a link 我也想澄清一下问题 我有 10 个列表项Listview我想要拥有deviderheight每个列表项的不同之处就像第一个项目应该是setDividerheight 2 第二次setDividerheigh
  • Maven:在pom.xml中设置settings.xml位置?

    是否可以设置位置settings xml文件内的pom xml file 我知道你可以通过命令行输入来做到这一点mvn s location of settings xml 但我想知道是否可以将其设置在pom xml所以我不必继续通过命令行
  • 如何使用媒体源 API 将两个视频文件数据附加到源缓冲区?

    我有两个视频 名称为 v11 webm 和 v12 webm 我想要的是这两个视频应该无缝运行 没有任何间隙 我正在遵循将数据附加到源缓冲区的媒体源 api 方法 我指的是对此给出的演示link 我修改了该示例并删除了对视频进行分块的部分
  • 平滑算法

    我编写了这段代码来平滑曲线 它需要一个点旁边的 5 个点并将它们相加并求平均值 Smoothing void smoothing vector
  • 在 Google 地图上移动并显示驾驶摄像头视图

    我已经通过谷歌地图路由添加了当前位置 Routing routing new Routing Builder travelMode Routing TravelMode DRIVING key getResources getString
  • 对“initscr”Ncurses 的未定义引用

    我正在尝试编译我的项目并使用 lib ncurse 当编译器链接文件时我遇到了一些错误 这是我在 Makefile 中的标志行 W Wall Werror Wextra lncurses 我已经包含了 ncurses h 一些布局 prom
  • MySQL UPDATE 查询,其中 id 最高并且字段等于变量

    我正在尝试构建一个 MySQL 查询 该查询将更新表中 id 最高且名为 idSession 的字段等于 65 的行 它看起来像这样 UPDATE History SET state 0 WHERE id SELECT MAX id FRO
  • Windows.Security.Cryptography 和 Windows Phone 8 SDK?

    今天我安装了新的Windows Phone 8 SDK w8phone SDK 尝试包括我的一些基类 来自 Windows 8 应用程序 他们说相同的核心 但是哎呀 no Windows Security Cryptography 我用的是
  • PHP-时间减去时间到分钟

    在 php 中我有两次 11 00 00 和 12 45 00 我想以分钟为单位得出它们之间的差异 在本例中为 105 分钟 最好的方法是什么 谢谢你 干得好 strtotime 12 45 00 strtotime 11 00 00 60
  • 为什么变量的寿命不够长?

    考虑这个函数 它应该返回给定的文件扩展名Path pub fn get extension lt a gt path a Path gt Option lt a str gt let path str path as str unwrap