为什么to_ascii_lowercase返回字符串而不是Cow <str>?

时间:2018-08-17 11:30:59

标签: string rust api-design copy-on-write

str::to_ascii_lowercase返回一个字符串。为什么它不像Cow<str>to_string_lossy一样返回String::from_utf8_lossy

str::to_ascii_uppercase也是如此。

1 个答案:

答案 0 :(得分:1)

大概想返回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.is_ascii() && bytes.iter().all(u8::is_ascii_lowercase) {
        Cow::Borrowed(s)
    } else {
        Cow::Owned(s.to_ascii_lowercase())
    }
}