2015-06-22 145 views
2

我是Rust新手,有以下工作代碼。但我不認爲我正在做的是最好的方法。我正在尋找關於這段簡單代碼的見解。地道借款

我有一個簡單的結構保存一些數據:

struct BlobRef { 
    hashname: String, 
} 

impl BlobRef { 
    fn hashname(self) -> String { 
     self.hashname 
    } 
} 

而且函數調用。不要擔心source: &[u8],它將有時間閃耀。

fn write(bref: BlobRef, source: &[u8]) -> io::Result<String> { 
    let hashname = bref.hashname(); 
    match fs::create_dir_all(&hashname) { 
     Ok(_) => Ok(hashname), 
     Err(e) => Err(e) 
    } 
} 

我需要指定另一個作用域的變量hashname停止編譯器抱怨「使用移動變量」。這是慣用的嗎?

+0

嘗試使用'&self'作爲'hashname'函數的參數,而不是'self' –

回答

6

這不是一個問題,這是否是地道與否,我相信;你需要寫什麼取決於你想達到什麼。

使用值爲self並將String移出結構,在進程中使用它(這是您的示例所做的)在某些上下文中是完全合法的,完全取決於您的用例。

在另一方面,如果你只想要得到的字符串值,某處讀取它(如你的例子說明),最好是返回一個字符串切片:

impl BlobRef { 
    fn hashname(&self) -> &str { 
     &self.hashname 
    } 
} 

現在你的第二個一塊代碼看起來是這樣的:

fn write(bref: &BlobRef, source: &[u8]) -> io::Result<String> { 
    let hashname = bref.hashname(); 
    match fs::create_dir_all(hashname) { 
     Ok(_) => Ok(hashname.into()), 
     Err(e) => Err(e) 
    } 
} 

這是爲了得到一個String&str需要額外的配置。

但是,如果BlobRef的唯一目的是將字符串傳遞到這個功能,那麼你原來的做法是完全正常的。