String 为什么tou ascii_小写返回字符串而不是Cow<;str>;?

String 为什么tou ascii_小写返回字符串而不是Cow<;str>;?,string,rust,api-design,copy-on-write,String,Rust,Api Design,Copy On Write,返回一个字符串。为什么它不返回一个与or相同的值 这同样适用于。您可能希望返回Cow的原因大概是因为字符串可能已经是小写。然而,当字符串还不是小写时,检测这种边缘情况也可能会导致性能下降,从直觉上看,这似乎是最常见的情况 当然,您可以创建自己的函数,将包装为\u ascii\u lowercase(),检查它是否已经是小写,并返回Cow: fn my_to_ascii_lowercase cow这是我的第一个想法,但无论如何都必须检查边缘大小写:在遍历字符串片段时,必须检查每个字符。现在,字符串

返回一个字符串。为什么它不返回一个与or相同的值


这同样适用于。

您可能希望返回
Cow
的原因大概是因为字符串可能已经是小写。然而,当字符串还不是小写时,检测这种边缘情况也可能会导致性能下降,从直觉上看,这似乎是最常见的情况

当然,您可以创建自己的函数,将
包装为\u ascii\u lowercase()
,检查它是否已经是小写,并返回
Cow


fn my_to_ascii_lowercase cow这是我的第一个想法,但无论如何都必须检查边缘大小写:在遍历字符串片段时,必须检查每个字符。现在,
字符串
是在前面分配的,然后它在每个字母上循环。需要时可以更改。您可以搜索第一个大写字母:
str.chars().position(|c |!c.is_lowercase())
。如果没有找到任何内容,则返回
Cow::Borrow
,否则从此点开始转换为小写。或多或少
fn my_to_ascii_lowercase<'a>(s: &'a str) -> Cow<'a, str> {
    let bytes = s.as_bytes();
    if bytes.is_ascii() && bytes.iter().all(u8::is_ascii_lowercase) {
        Cow::Borrowed(s)
    } else {
        Cow::Owned(s.to_ascii_lowercase())
    }
}