首页 文章

如何在Rust中的Impl块中转换&str中的String

提问于
浏览
1

我是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 回答

  • 2

    这基本上是不可能的 . 如果你返回某个东西的引用,那么某些内容必须存储在某个地方 . 忽略任务本地存储和静态,这意味着只需 &self 的方法,它必须存储在 self 中 .

    您不能返回对您要返回的方法所拥有的内容的引用,因为当您返回对它的引用时,它会超出范围并被销毁 .

    如果调用者需要字符串片而不是拥有的字符串,请让他们自己调用 self.to_string().as_slice() .


    顺便说一下,为了获得最佳效果,您应该实施 std::fmt::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,您可以直接在 format!("{}", task) 中使用 Task ,依此类推 .

  • 4

    如果我们看一下rust documentation for str,我们会发现一些有见地的摘录 .

    &str是借用的字符串类型 . 这种类型的字符串只能从其他字符串创建,除非它是静态字符串

    字符串的实际表示具有向量的直接映射:&str与&[u8]相同 .

    这意味着非静态 &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中找到更清楚的信息 .

    我自己没有足够的经验来提供解决问题的方法,但希望这能解释错误 .

相关问题