我是Rust的新手,为了更熟悉我开始写一点ToDo程序的语言 .
我做了一个与任务对应的结构:
struct Task {
id: int,
title: &'static str
}
我试图实现一些方法直接获取格式化的行写入文件:
impl Task {
fn to_string (&self) -> String {
let line = self.id.to_string() + "\t" + self.title;
line
}
fn to_str (&self) -> &str {
let line = self.to_string();
let formatted_str : &str = line.as_slice();
formatted_str
}
}
我收到一个错误,说'line'的寿命不够长 . 我试图添加生命周期信息,如下所述:http://rustbyexample.com/lifetime/fn.html但我又遇到了同样的错误 .
有这种情况的解决方案吗?我是Rust的新手,所以我可能错过了一些东西 .
谢谢你的帮助 !
2 回答
这基本上是不可能的 . 如果你返回某个东西的引用,那么某些内容必须存储在某个地方 . 忽略任务本地存储和静态,这意味着只需
&self
的方法,它必须存储在self
中 .您不能返回对您要返回的方法所拥有的内容的引用,因为当您返回对它的引用时,它会超出范围并被销毁 .
如果调用者需要字符串片而不是拥有的字符串,请让他们自己调用
self.to_string().as_slice()
.顺便说一下,为了获得最佳效果,您应该实施
std::fmt::Show
;这会自动获得.to_string() method,您可以直接在
format!("{}", task)
中使用Task
,依此类推 .如果我们看一下rust documentation for str,我们会发现一些有见地的摘录 .
和
这意味着非静态
&str
表示为指向u8
的向量所拥有的数据的指针(即String
) . 然而,&str
本身并不拥有u8
.line
,在上面的代码中,是to_str
函数中的局部变量 . 这意味着当to_str
返回时,line
超出范围,并且它会破坏它拥有的数据:一堆u8
.formatted_str
正在借用line
拥有的数据 . 因此,您无法返回formatted_str
,因为它正在借用的数据的生命周期在to_str
返回时结束 . 您可能会在a simplified version of the code you provided中找到更清楚的信息 .我自己没有足够的经验来提供解决问题的方法,但希望这能解释错误 .