Convert string to pig latin in Rust
You've got a good use of match and some solid iterator usage, very nice!


Your closures don't need to be closures -- they don't capture any environment. You can just make them functions (even defined inside the other function, if you'd like). Normally, prefer to define closures at the site of use, instead of as variables ahead of the use. This allows type inference to work on them more effectively (probably why you had to specify types for the closure arguments and return values).
Chars::as_str allows you to get the remainder of the underlying string, so you don't need to iterate though all the remaining characters.
The format! macro allows you to build a string from components in a nicer way.
The code doesn't handle empty strings (unwrap makes this easy to find); there's no reason to not handle them.
You don't need to create a new String in folder, just mark the incoming String as mutable




fn pigify_one(word: &amp;str) -&gt; String {
    let mut chars = word.chars();

    let first_char = match chars.next() {
        Some(c) =&gt; c,
        None =&gt; return String::new(),
    };

    match first_char {
        'a' | 'e' | 'i' | 'o' | 'u' =&gt; format!("{}-hay", word),
        _ =&gt; format!("{}-{}ay", chars.as_str(), first_char),
    }
}

fn folder(mut current: String, next: String) -&gt; String {
    if !current.is_empty() {
        current.push(' ');
    }
    current.push_str(&amp;next);
    current
}

fn pigify(text: &amp;str) -&gt; String {
    text.split_whitespace()
        .map(pigify_one)
        .fold(String::new(), folder)
}




I'm a big fan of itertools, which provides methods like join:

extern crate itertools;

use itertools::Itertools;

fn pigify(text: &amp;str) -&gt; String {
    text.split_whitespace()
        .map(pigify_one)
        .join(" ")
}


See What's an idiomatic way to print an iterator separated by spaces in Rust?