Ich versuche, ein neues Merkmal für einen String zu implementieren, der eine Funktion hat, die den ersten Buchstaben jedes Strings groß schreibt und den Rest nicht groß schreibt. Ich basiere die Schnittstelle der Funktion auf to_uppercase()
und to_lowercase()
in der Rust Standard Library.Wie sammle ich mehrere Iterator-Typen?
use std::io;
trait ToCapitalized {
fn to_capitalized(&self) -> String;
}
impl ToCapitalized for String {
fn to_capitalized(&self) -> String {
self.chars().enumerate().map(|(i, c)| {
match i {
0 => c.to_uppercase(),
_ => c.to_lowercase(),
}
}).collect()
}
}
fn main() {
let mut buffer = String::new();
io::stdin().read_line(&mut buffer).ok().expect("Unable to read from stdin.");
println!("{}", buffer.to_capitalized());
}
Dieser Code basiert auf einem Vorschlag gegeben here, aber der Code ist veraltet und verursacht mehrere Kompilierungsfehlern. Das einzige Problem, das ich jetzt mit meiner Implementierung habe die folgende Fehlermeldung:
src/main.rs:10:13: 13:14 error: match arms have incompatible types [E0308]
src/main.rs:10 match i {
^
src/main.rs:10:13: 13:14 help: run `rustc --explain E0308` to see a detailed explanation
src/main.rs:10:13: 13:14 note: expected type `std::char::ToUppercase`
src/main.rs:10:13: 13:14 note: found type `std::char::ToLowercase`
src/main.rs:12:22: 12:38 note: match arm with an incompatible type
src/main.rs:12 _ => c.to_lowercase(),
Also kurz gesagt, die Rückgabewerte von fn to_uppercase(&self) -> ToUppercase
und fn to_lowercase(&self) -> ToLowercase
können nicht zusammen gesammelt werden, da die Karte nun mehrere Rückgabetypen hat.
Ich habe versucht, sie zu einem anderen gemeinsamen Iterator Typ wie Bytes
und Chars
zu werfen, aber diese Iterator-Typen können nicht gesammelt werden, um eine Zeichenfolge zu bilden. Irgendwelche Vorschläge?
[Kann vereinfacht und leicht optimiert werden] (https://play.rust-lang.org/?gist=dfa85b1d5e07d8e5e29785c5e530ee76). – Shepmaster