为什么我可以返回对函数拥有值的引用?

彼得·瓦罗

Rust编程语言的第19.2章中,以下示例可正确编译。我从问题#1834发现,有一个新的生存期删除规则隐含地使的's时间长于'c

尽管我找不到这个新省略规则的详细说明,但我想它不只是更长,更明确的约束的隐式版本:<'c, 's: 'c>我认为,但是我的困惑可能与这个新的省略规则无关,但是我对此可能是错误的。

我的理解是,这parse_context需要所有权,context因为它没有被借用,但实际上已移交给职能部门。仅此一项对我意味着context,无论我们在Context和中定义的生存期和约束如何,的生存期都应与其所拥有功能的生存期相匹配Parser

基于这些定义,对我而言,context超出临时Parser属性的部分非常有意义(毕竟,我们定义了更长的生命周期),但是&strcontext结束超出范围并不会删除引用的部分,parse_context我仍然可以安全地进行操作。还给我-让我感到困惑。

我错过了什么?编译器如何解释返回的生存期&str

更新示例

struct Context<'s>(&'s str);

struct Parser<'c, 's>
{
    context: &'c Context<'s>,
}

impl<'c, 's> Parser<'c, 's>
{
    fn parse(&self) -> Result<(), &'s str>
    {
        Err(self.context.0)
    }
}

fn parse_context(context: Context) -> Result<(), &str>
{
    Parser { context: &context }.parse()
}

fn main()
{
    let mut s = String::new();
    s += "Avail";
    s += "able?";
    if let Err(text) = parse_context(Context(&s))
    {
        println!("{}", text);
    }
}
mb
struct Context<'s>(&'s str);

→type的值Context保存具有一定寿命的字符串's该生存期隐式地至少与上下文的生存期一样长,但是可能更长。

struct Parser<'c, 's>
{
    context: &'c Context<'s>,
}

→type的值Parser保留了对上下文的引用,并存在一定生命周期'c该上下文包含具有其他生存期的字符串's

impl<'c, 's> Parser<'c, 's>
{
    fn parse(&self) -> Result<(), &'s str>
    {
        Err(self.context.0)
    }
}

→函数parse返回一个带有生命周期的值's,即。具有与存储在上下文中的字符串相同的生存期,这与上下文本身的生存期不同。

fn parse_context(context: Context) -> Result<(), &str>
{
    Parser { context: &context }.parse()
}

→我不确定确切在哪里指定,但是显然编译器会推断返回的字符串的生存期与's用于上下文参数相同请注意,即使上下文本身已移入parse_context,这也只会影响上下文本身,而不会影响其包含的字符串。

fn main()
{
    let mut s = String::new();

→创建一个新字符串,有效期至 main

    s += "Avail";
    s += "able?";
    if let Err(text) = parse_context(Context(&s))

→创建一个新的上下文并将其移入parse_context它将在末尾自动删除parse_context它持有一个对字符串的引用,该字符串s在的结尾一直有效,mainparse_context返回一个与s相同的生存期的字符串,text直到该结尾有效main

    {
        println!("{}", text);
    }
}

→没问题:text有效期至main

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的异步函数返回Promise {<pending>}而不是值?

为什么我的异步函数返回Promise {<pending>}而不是值?

为什么我的arrow函数不返回值?

为什么我不能从主函数返回更大的值?

为什么我的函数没有返回?

如何解决Rust中的“返回引用当前函数拥有的数据的值”错误?

由于C ++具有const引用,为什么我还应该按值返回值?

为什么此函数返回(拥有的)值?

可以实现返回引用或拥有值的Trait方法

为什么我的递归dfs函数返回错误的值?

为什么我可以修改const按引用返回?

为什么我可以在函数后返回“ int”而不是“ char *”?

为什么可以从函数返回对文字的可变引用?

为什么在Rust中允许返回当前函数拥有的引用?

为什么带符号的char可以拥有比127大的值?

从函数返回libusb :: Device的问题-尝试返回引用当前函数拥有的数据的值

错误消息不清楚:返回引用当前函数拥有的数据的值

为什么我可以为右值引用分配值?

为什么主函数没有返回值就可以工作?

为什么我的SQL函数返回意外值?

为什么我可以返回对对象的引用?

为什么C ++中的函数可以返回堆栈值

为什么在我的函数类型之后使用引用运算符(&)允许我修改它返回的值?

为什么我的函数没有返回正确的值

返回引用当前函数拥有的数据的值

为什么我的向量被重置而不是拥有自己的值?

为什么我的函数没有在几秒钟内返回正确的值?

当我使用 find_all 函数时,为什么 beautifulsoup 不会返回所有值?

Rust:返回一个引用当前函数拥有的数据的值