为什么to_ascii_lowercase返回一个String而不是Cow<str>?

5
1个回答

2
您可能想返回一个 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())
    }
}

6
这是我的第一印象,但你必须仍然检查边缘情况:当遍历字符串切片时,你必须检查每个字符。目前,先分配了String,然后循环遍历每个字母,需要时再更改。相反,你可以直接寻找第一个大写字母的出现位置: str.chars().position(|c| !c.is_lowercase())。如果找不到任何字符,就返回Cow::Borrow,否则从该点开始转换为小写。 - Tim Diekmann
大致上是这样的:链接 - Tim Diekmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接