2017-01-10 25 views
0

我有這樣的通用功能在我的防鏽代碼:泛型函數解析數字失敗「FromStr未實現」

fn test<T>(text: &str) -> T { 
    text.parse::<T>() 
} 

的想法是,來電者會做類似

test::<u64>("2313"); 

但彙編失敗,並帶此消息

error: the trait `core::str::FromStr` is not implemented for the type `T` [E0277] 

我昨天剛開始學習Rust,所以這是proba bly一個非常基本的問題,我沒有找到答案。

+1

你讀過[在鏽書性狀章(https://開頭doc.rust-lang.org/book/traits.html)?它解釋了基本知識,並應幫助您解決問題。 –

回答

6

與錯誤消息狀態一樣,T需要執行core::str::FromStr以便適用於parse函數。的parse類型簽名是:

fn parse<F>(&self) -> Result<F, F::Err> where F: FromStr 

這限制了排序F(或者,你的情況T),您可以使用這些實施FromStr。您的其他問題是由test返回的類型;它應該與parse - a Result中的一個相同。

當你解決這些問題,你的函數將工作:

use std::str::FromStr; 

fn test<T: FromStr>(text: &str) -> Result<T, T::Err> { 
    text.parse::<T>() 
} 

fn main() { 
    println!("{:?}", test::<u64>("2313")); 
} 

好了(2313)

3

當你聲明一個泛型類型參數T時,你不知道有關該類型的任何信息。它可以是i32String,()PinkElephant;只有其中的兩個可以從字符串中解析。

在Rust中限制類型的方法是通過特徵邊界:我們明確地請求類型中的特定行爲。像「這種類型可以是任何類型,但我至少想要克隆這種類型的一個實例」(這將是Clone特徵)。你可以(也應該!)閱讀更多關於特徵in the dedicated chapter in the Rust book的主題。

那麼你期望從你的類型T什麼功能?您想通過使用str::parse()從字符串中創建T的實例。的parse()函數簽名是:

fn parse<F>(&self) -> Result<F, F::Err> 
    where F: FromStr 

它也需要這個通用的參數F與性狀FromStr界定它。因此,爲了使用parse(),,您的類型參數T也需要實現FromStr。你的函數可以是這樣的:

use std::str::FromStr; 

fn test<T: FromStr>(text: &str) -> T { 
    text.parse::<T>().expect("string was invalid!") 
} 

這是什麼expect()你問?那麼......我們在這裏觸及另一個話題:錯誤處理。還有一個chapter on that topic in the book,你應該閱讀。簡而言之:您需要以某種方式處理該字符串無效的情況(例如,當您試圖解析整數時,就是"peter")。 expect()在這裏可能是錯誤的方式:當解析沒有成功時,它只是恐慌(中止線程)。

還要記住,有一個編譯器錯誤索引,您可以在其中閱讀有關特定錯誤的更多信息。 Here is the entry爲您的錯誤E0277。

相關問題