當你聲明一個泛型類型參數T
時,你不知道有關該類型的任何信息。它可以是i32
,String
,()
或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。
你讀過[在鏽書性狀章(https://開頭doc.rust-lang.org/book/traits.html)?它解釋了基本知識,並應幫助您解決問題。 –