【问题标题】:How convert a String in &str in Impl block in Rust如何在 Rust 的 Impl 块中转换 &str 中的字符串
【发布时间】:2014-07-20 23:16:12
【问题描述】:

我对 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 新手,所以我可能错过了一些东西。

感谢您的帮助!

【问题讨论】:

    标签: rust


    【解决方案1】:

    这基本上是不可能的。如果您返回对某事物的引用,则该事物必须存储在某处。忽略任务本地存储和静态,这意味着对于只采用 &self 的方法,它必须存储在 self 中。

    您不能返回对您从中返回它的方法所拥有的东西的引用,因为当您返回对它的引用时,它会超出范围并被销毁。

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


    顺便说一句,为了获得最佳效果,您应该实施@987654321@::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等等。

    【讨论】:

      【解决方案2】:

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

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

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

      这意味着非静态&str 表示为指向u8 的向量(即String)所拥有的数据的指针。然而,&str 本身并不拥有u8

      line,在上面的代码中,是to_str 函数中的局部变量。这意味着当to_str 返回时,line 超出范围,它会破坏它拥有的数据:一堆u8formatted_str 正在借用 line 拥有的数据。因此,您不能返回formatted_str,因为它借用的数据的生命周期在to_str 返回时结束。您可能会在a simplified version of the code you provided 中发现这一点更清楚。

      我本人对 rust 的经验不足,无法为您的问题提供解决方案,但希望这可以解释错误。

      【讨论】:

        猜你喜欢
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 2014-07-14
        相关资源
        最近更新 更多