簡體   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