Pet*_*all 2

您可能想要返回 a 的原因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())
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我的第一个想法,但无论如何你都必须检查边缘情况:在迭代字符串切片时,你必须检查每个字符。目前,“String”是在之前分配的,然后循环遍历每个字母。当需要时它会改变。您可以只搜索第一次出现的大写字母:`str.chars().position(|c| !c.is_lowercase())`。如果没有找到任何内容,则返回“Cow::Borrow”,否则从此时开始转换为小写。 (7认同)