繁体   English   中英

如何修复 rust 中的通用 function 错误

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM