2014-07-20 66 views
1

我對Rust很陌生,爲了更熟悉該語言,我開始編寫一個ToDo程序。如何在Rust中的Impl塊中將str轉換爲&str

我做了相應的任務一個結構:

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的新手,所以我可能錯過了一些東西。

感謝您的幫助!

回答

4

這從根本上是不可能的。如果你返回一個引用的東西,那東西必須存儲在某個地方。忽略任務本地存儲和靜態,這意味着一個方法只需要&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自動的,你可以用你的Task直接format!("{}", task)等等。

+0

非常感謝!它完美的作品。 –

2

如果我們看一下rust documentation for str,我們會發現一些有洞察力的摘錄。

& str是借來的字符串類型。這種類型的字符串只能從其他字符串創建的,除非它是一個靜態字符串

串的實際表示具有直接映射到載體:& str是相同& [ U8。

這意味着非靜態&str被表示爲指針成的u8的(即String)的矢量所擁有的數據。然而,&str本身並不擁有u8's。

line,在上面的代碼中,是to_str函數中的局部變量。這意味着當to_str返回時,line超出範圍,並且銷燬它擁有的數據:一堆u8's。 formatted_str正在借用line所擁有的數據。因此,您不能返回formatted_str,因爲它正在借用的數據的生命週期在to_str返回時結束。你可能會在a simplified version of the code you provided找到更清楚的。

我沒有足夠的防鏽經驗來解決您的問題,但希望這可以解釋錯誤。

相關問題