[英]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.