我可以在 Rust 中修改结构体实例上的 &'a str ,使其在修改后具有相同的 &'a str 生命周期吗?

问题描述 投票:0回答:1
struct test<'a> {
    name: &'a str
}

impl<'a> test<'a> {
    fn modify_name(&'a mut self) {
        let new_name = self.name.replacen("az", "", 1);
        // i want to add this name to self with the same lifetime as self
        self.name = &'a new_name[..];
    }
}

不允许像上面那样分配生命周期,如果我没有指定 str 的生命周期,rust 会在函数结束后尝试删除它。 也无法取消引用 self.name,因为“str 在编译时无法得知。

我尝试在网上查找,但只找到了使用 String 而不是 &str 的建议。

我想知道是否可以修改引用的结构体字段。 (我在结构中使用了很多 &str 并且很少修改它们,所以我更喜欢有 &str)

不确定这是否可能。如果不是,请向我解释一下,我错过了什么?

rust reference lifetime
1个回答
0
投票

按照书面方式执行此操作的唯一方法是泄漏

String
。这为您提供了
'static
生命周期的参考,它将自动强制为任何更短的生命周期。然而,这显然不太理想,因为在程序终止之前,堆分配永远不会被释放。 fn modify_name(&'a mut self) { self.name = self.name.replacen("az", "", 1).leak() }

要做到这一点
而不

泄漏内存,您需要更改name的类型。每次你在 Rust 中看到

&
时,它的意思是“这个值借用了其他地方的东西”。在您的情况下,您想借用一个新字符串,但这意味着
您需要在某个地方放置至少与 
'a一样长的字符串。

一种可能的解决方法是使用

Cow

,它代表可以借用或
拥有的值。在此示例中,调用 test::modify_name 后,name
 字段将为 
Cow::Owned
,无论之前是借用还是拥有。
use std::borrow::Cow;

struct test<'a> {
    name: Cow<'a, str>
}

impl<'a> test<'a> {
    fn modify_name(&'a mut self) {
        self.name = self.name.replacen("az", "", 1).into()
    }
}


© www.soinside.com 2019 - 2024. All rights reserved.