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)
不确定这是否可能。如果不是,请向我解释一下,我错过了什么?
按照书面方式执行此操作的唯一方法是泄漏
String
。这为您提供了 'static
生命周期的参考,它将自动强制为任何更短的生命周期。然而,这显然不太理想,因为在程序终止之前,堆分配永远不会被释放。
fn modify_name(&'a mut self) {
self.name = self.name.replacen("az", "", 1).leak()
}
要做到这一点而不
泄漏内存,您需要更改name
的类型。每次你在 Rust 中看到
&
时,它的意思是“这个值借用了其他地方的东西”。在您的情况下,您想借用一个新字符串,但这意味着 您需要在某个地方放置至少与
'a
一样长的字符串。
一种可能的解决方法是使用 ,它代表可以借用或拥有的值。在此示例中,调用
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()
}
}