相关疑难解决方法(0)

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

考虑这个应该返回给定文件扩展名的函数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
    }
}
Run Code Online (Sandbox Code Playgroud)

错误消息如下:

`path_str` does not live long enough
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

错误信息很清楚,很遗憾我无法自己解决这个问题.我在理论上理解它,但对我来说还有一些模糊的东西.

据我所知,编译器想告诉我,path_str活动时间不够长,因为返回值标记为生命周期'a.

但这就是它停止的地方:

  • 据我所知,对path(输入参数)的引用应该与strOption(包含在输出参数中)的引用完全一样长

  • 因为我们回来了,Some(path_str.as_slice().slice_from(start))我认为在实践中,这意味着只path_str需要生活path.

我不明白的是到底为什么path_str不活足够长的时间,我怎么能解决这个问题?是什么让它很快死去?

UPDATE

正如在评论中指出的那样以及IRC中删除superflous as_slice()使代码编译.有谁知道那是为什么?还有人指出存在一种直接获得扩展的方法.但是,我实际上更感兴趣的是学习问题背后的故事.

lifetime object-lifetime rust

9
推荐指数
1
解决办法
5546
查看次数

如何从函数返回反向字符串?

我想编写一个函数,该函数将反转字符串并返回对返回的字符串的引用。我以为我可以指定返回的引用与提供的引用具有相同的生存期。

fn reverse_string<'a>(input: &'a str) -> &'a str {
    let res: &'a str = input.chars().rev().collect().as_slice();
    res
}
Run Code Online (Sandbox Code Playgroud)

这是我的尝试,并且收到错误消息:

fn reverse_string<'a>(input: &'a str) -> &'a str {
    let res: &'a str = input.chars().rev().collect().as_slice();
    res
}
Run Code Online (Sandbox Code Playgroud)

我以为类型规范可以解决这个问题。生命对我来说有些混乱,所以我希望有人能够解释如何正确执行此操作,或者我是否一开始就完全不了解。

lifetime rust

2
推荐指数
1
解决办法
794
查看次数

标签 统计

lifetime ×2

rust ×2

object-lifetime ×1