MST

星途 面试题库

面试题:Rust字符串扩展中泛型和trait bounds的应用

假设你要为多种类型(如`String`、`Vec<char>`等序列类型)实现一个通用的字符串扩展方法,该方法用于查找特定字符第一次出现的位置。请使用泛型和合适的trait bounds来编写这个扩展,同时说明为什么要这样设置trait bounds。
25.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,可以通过以下方式实现这个通用的字符串扩展方法:

trait StringExt {
    fn find_char(&self, ch: char) -> Option<usize>;
}

impl<T> StringExt for T
where
    T: AsRef<str>,
{
    fn find_char(&self, ch: char) -> Option<usize> {
        self.as_ref().find(ch)
    }
}

为什么设置 AsRef<str> trait bounds

  1. 通用性AsRef<str> trait允许任何类型只要能转换为 &str 就可以实现这个扩展方法。这使得 String&strVec<char> 等类型都能使用该方法,因为它们都实现了 AsRef<str>。例如,String 本身就实现了 AsRef<str>,而 Vec<char> 可以通过 into_iter().collect::<String>() 转换为 StringString 又能转换为 &str

  2. 操作便利性&str 类型提供了丰富的字符串操作方法,其中就包括 find 方法,用于查找字符第一次出现的位置。通过要求实现 AsRef<str>,我们可以直接利用 &str 类型的这些方法,而无需为每种具体类型单独实现查找逻辑。

使用上述代码,就可以在多种序列类型上调用 find_char 方法来查找特定字符第一次出现的位置,例如:

fn main() {
    let s1: String = "hello world".to_string();
    let s2: &str = "hello world";
    let v: Vec<char> = "hello world".chars().collect();

    assert_eq!(s1.find_char('o'), Some(4));
    assert_eq!(s2.find_char('o'), Some(4));
    assert_eq!(v.find_char('o'), Some(4));
}