Использование различных типов строк с конструкциями if else в Rust


Очевидно, что не работает следующее:

fn main() {
    for i in range(1i, 101) {
        println!("{}", if i % 15 == 0 {
            "Fizzbuzz"
        } else if i % 5 == 0 {
            "Buzz"
        } else if i % 3 == 0 {
            "Fizz"
        } else {
            i
        });
    };
}

Его можно заставить работать так:

fn main() {
    for i in range(1i, 101) {
       println!("{}", if i % 15 == 0 {
            "Fizzbuzz".to_string()
        } else if i % 5 == 0 {
            "Buzz".to_string()
        } else if i % 3 == 0 {
            "Fizz".to_string()
        } else {
            i.to_string()
        });
    }
}
Но каков самый элегантный (вероятно, идиоматический) способ заставить его работать подобным образом, используя if / else с выражениями?
1 2

1 ответ:

Всестороннее исследование FizzBuzzиспользует теперь устаревшую структуру под названием MaybeOwned. Вот обновленная версия, с восхитительно названным CowString:

use std::borrow::Cow;

fn main() {
    for i in 1..10 {
        println!("{}", if i % 15 == 0 {
            Cow::Borrowed("Fizzbuzz")
        } else if i % 5 == 0 {
            Cow::Borrowed("Buzz")
        } else if i % 3 == 0 {
            Cow::Borrowed("Fizz")
        } else {
            Cow::Owned(i.to_string())
        });
    };
}
Тем не менее, вы должны прочитать этот полный пост в блоге для максимального образования!