Hi, Ollie,
This variant is terser, but it could be even more readable if there were some
kind of connect() for iterators. It surprised me that there is no such thing in
Rust iterators. It would be possible to use some kind of interleave() for
iterators for the same purpose, but there is no such thing as well. Hence I had
to use fold() and then pop_char() which is rather nasty as it breaks method
chain.
On the other hand, this variant performs less allocations than your original
version because the resulting string is allocated in advance.
use std::char;
fn name_from_file(file: String) -> String {
let mut r = file.as_slice().split('-')
.map(|w|
char::to_uppercase(w.char_at(0)).to_string().append(w.slice_chars(1, w.len())))
.fold(
String::with_capacity(file.len()+1),
|r, w| r.append(w.as_slice()).append(" ")
);
r.pop_char();
r
}
fn main() {
let hypenated_string = "hello-there".to_string();
let capitalized_string = name_from_file(hypenated_string);
println!("{}", capitalized_string);
}
See it in action here: http://is.gd/UKKB96
BTW, I suggest you to use Stackoverflow [1] (preferred) or Reddit [2] to ask
questions like this. The active community there is much larger than here, so
you can get an answer quicker.
[1]: http://stackoverflow.com/questions/tagged/rust
[2]: http://www.reddit.com/r/rust/
On 12 сент. 2014 г., at 15:35, Oldřich Vetešník <[email protected]>
wrote:
> Hello,
>
> this is probably going to sound silly, but can this be written better?
> I’d like to turn “hello-there” into “Hello There”.
> I was thinking about something along the lines of split -> map -> capitalize
> -> join but the capitalization seems kind of awful to me.
>
> use std::char;
>
> fn name_from_file(file: String) -> String {
> let mut words: Vec<&str> = file.as_slice().split('-').collect();
> let mut cap_words = Vec::new();
>
> for word in words.mut_iter() {
> let first = char::to_uppercase(word.char_at(0)).to_string();
> let rest = word.slice_chars(1, word.len());
>
> let cap_word = first.append(rest);
> cap_words.push(cap_word);
> }
>
> cap_words.connect(" ")
> }
>
> fn main() {
> let hypenated_string = "hello-there".to_string();
> let capitalized_string = name_from_file(hypenated_string);
> println!("{}", capitalized_string);
> }
>
>
> Thanks,
> Ollie
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev