str::to_ascii_lowercase
返回的是一个String类型,为什么它不像to_string_lossy
或String::from_utf8_lossy
那样返回一个Cow<str>
呢?对于
str::to_ascii_uppercase
也同样适用。str::to_ascii_lowercase
返回的是一个String类型,为什么它不像to_string_lossy
或String::from_utf8_lossy
那样返回一个Cow<str>
呢?str::to_ascii_uppercase
也同样适用。Cow<str>
的原因是字符串可能已经是小写。然而,检测这种边界情况可能会导致性能下降,尤其是当字符串不是小写的时候,这似乎是最常见的情况。to_ascii_lowercase()
,检查它是否已经是小写,并返回一个 Cow<str>
。fn my_to_ascii_lowercase<'a>(s: &'a str) -> Cow<'a, str> {
let bytes = s.as_bytes();
if !bytes.iter().any(u8::is_ascii_uppercase) {
Cow::Borrowed(s)
} else {
Cow::Owned(s.to_ascii_lowercase())
}
}
String
,然后循环遍历每个字母,需要时再更改。相反,你可以直接寻找第一个大写字母的出现位置:str.chars().position(|c| !c.is_lowercase())
。如果找不到任何字符,就返回Cow::Borrow
,否则从该点开始转换为小写。 - Tim Diekmann