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 <oldrich.vetes...@gmail.com> 
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
> Rust-dev@mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev

_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to