面试题答案
一键面试在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
-
通用性:
AsRef<str>
trait允许任何类型只要能转换为&str
就可以实现这个扩展方法。这使得String
、&str
、Vec<char>
等类型都能使用该方法,因为它们都实现了AsRef<str>
。例如,String
本身就实现了AsRef<str>
,而Vec<char>
可以通过into_iter().collect::<String>()
转换为String
,String
又能转换为&str
。 -
操作便利性:
&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));
}