如何将反向域表示法转换为 PascalCase?

How do I convert reverse domain notation to PascalCase?

我想将 "foo.bar.baz" 转换为 "FooBarBaz"。我的输入永远只是 ASCII。我试过了:

let result = "foo.bar.baz"
    .to_string()
    .split(".")
    .map(|x| x[0..1].to_string().to_uppercase() + &x[1..])
    .fold("".to_string(), |acc, x| acc + &x);
println!("{}", result);

但这感觉效率低下。

您的解决方案是一个好的开始。您可以在 "functional" 风格的堆分配情况下使其工作;不过,我更喜欢将复杂的逻辑放入正常的 for 循环中。

此外,我不喜欢在没有实际检查的情况下假设输入是 ASCII - 这应该适用于任何字符串。

您可能还可以在代码中使用 String::with_capacity 以避免在标准情况下重新分配。

Playground

fn dotted_to_pascal_case(s: &str) -> String {
    let mut result = String::with_capacity(s.len());
    for part in s.split('.') {
        let mut cs = part.chars();
        if let Some(c) = cs.next() {
            result.extend(c.to_uppercase());
        }
        result.push_str(cs.as_str());
    }
    result
}

fn main() {
    println!("{}", dotted_to_pascal_case("foo.bar.baz"));
}

Stefan 的回答是正确的,但我决定摆脱第一个 String 分配并实现全功能,没有循环:

fn dotted_to_pascal_case(s: &str) -> String {
    s.split('.')
        .map(|piece| piece.chars())
        .flat_map(|mut chars| {
            chars
                .next()
                .expect("empty section between dots!")
                .to_uppercase()
                .chain(chars)
        })
        .collect()
}

fn main() {
    println!("{}", dotted_to_pascal_case("foo.bar.baz"));
}