我是 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
}
}
我收到一条错误消息,指出“线路”的生命周期不够长。我已尝试添加生命周期信息,如下所述:http://rustbyexample.com/lifetime/fn.html但我又遇到了同样的错误。
这种情况有解决办法吗?我是 Rust 的新手,所以我可能错过了一些东西。
感谢您的帮助!
最佳答案
这根本不可能。如果您返回对某物的引用,则该某物必须存储在某处。忽略任务本地存储和静态,这意味着只需要 &self
的方法它必须存储在 self
中.
您不能返回对您返回它的方法所拥有的东西的引用,因为当您返回对它的引用时,它会超出范围并被销毁。
让您的调用者调用 self.to_string().as_slice()
如果他们需要一个字符串切片而不是一个拥有的字符串,他们自己。
顺便说一句,为了获得最佳结果,您应该实现 <a href="http://static.rust-lang.org/doc/master/std/fmt/index.html" rel="noreferrer noopener nofollow">std::fmt</a>::Show
;
use std::fmt;
impl fmt::Show for Task {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}\t{}", self.id, self.title)
}
}
这会让你得到一个 .to_string()
method自动,你可以使用你的Task
直接在format!("{}", task)
等等。
关于rust - 如何在 Rust 的 Impl block 中转换 &str 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24855830/