[英]How to fix error with generic function in rust
我試圖了解 Rust 中的 generics。 我無法理解這里出了什么問題
fn say<T>(msg: &T) {
let slen = msg.chars().count();
if slen > 0 {
println!("Char Count {} " ,slen);
}
}
fn main() {
let msg = String::from("Hello World from Rust!!!");
say::<String>(&msg);
}
編譯錯誤:
error[E0599]: no method named `chars` found for reference `&T` in the current scope
--> hell.rs:4:20
|
4 | let slen = msg.chars().count();
| ^^^^^ method not found in `&T`
您的 function say
假設輸入具有chars
方法,該方法在chars
上創建迭代器。 這適用的類型並不多,因此使其通用化似乎不是很有用。
具有chars
迭代器方法的主要兩種類型是String
和&str
。 如果您將參數更改為&str
,那么您可以接受其中之一:
fn say(msg: &str) {
let slen = msg.chars().count();
if slen > 0 {
println!("Char Count {} ", slen);
}
}
fn main() {
let msg: String = String::from("Hello World from Rust!!!");
say(&msg);
let msg: &str = "Hello World from Rust!!!";
say(msg);
}
也可以看看:
Rust generics 背后的想法是泛型類型受trait bounds限制和定義。 由一組特征綁定的T
上的 function 泛型可能會假設T
具有來自這些特征的方法,僅此而已。 由於T
不受任何特征的約束,因此沒有T::chars()
方法可以調用。
要編寫調用任何現有特征不提供的方法的通用代碼,例如chars()
,您可以編寫自己的特征來提供所需的功能,並為您需要的類型實現它。 例如:
trait CharCount {
fn char_count(&self) -> usize;
}
impl CharCount for String {
fn char_count(&self) -> usize {
self.chars().count()
}
}
有了這個特性,你可以編寫你的通用方法來使用它:
fn say<T: CharCount>(msg: &T) {
let slen = msg.char_count();
if slen > 0 {
println!("Char count: {}", slen);
}
}
您可以使用String
調用say
,也可以使用決定實現CharCount
特征的任何其他類型,即使它是您在編寫該特征時沒有想到的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.