Бум или крах, 50 дней до ржавчины золота в Колорадо: день 3

Вчерашний проект помог нам познакомиться с частью экосистемы Rust. Сегодня мы собираемся сделать еще пару проектов, чтобы познакомить нас с некоторыми функциями, стандартными для большинства современных языков программирования.

В качестве небольшого примечания в первых нескольких частях этой серии я буду следить за Языком программирования Rust.» Стив Клабник и Кэрол Николс — авторы этой восхитительной книги, которую можно найти здесь https://doc.rust-lang.org/book/ или здесь https://nostarch.com/Rust2018. Я настоятельно рекомендую вам купить копию и поддержать авторов.Все права на этот исходный материал принадлежат им. Кроме того, в этой серии статей описан мой опыт изучения Rust. Таким образом, я не буду охватывать всю информацию, обсуждаемую в книге. Второе примечание: это вторая часть серии из 51 части, поэтому, если вы не читали предыдущие части серии здесь, это https://medium.com/@shawnbachlet/boom-or-bust-50. -days-to-colorado-gold-rust-day-2-2b90c47ecd58». Вот ссылка на начало серии, если хотите начать читать оттуда https://medium.com/@shawnbachlet/boom-or-bust-50-days-to-colorado-gold-rust-day- 0-58091dc6d92c.

Настройка

Сегодня мы рассмотрим три небольших проекта и рассмотрим некоторые стандартные функции языка Rust. Эти:

  • Переменные (изменчивость, неизменность, константы и затенение)
  • Типы данных (скалярные и составные)
  • Функции
  • Поток управления (if/else и цикл)

Для начала нам нужно создать три проекта.

$ cargo new --bin temperature
$ cargo new --bin fibonnaci
$ cargo new --bin christmas

Температура

Температура нашего первого проекта довольно проста. Этот проект преобразует значения между градусами Цельсия и Фаренгейта.

fn main() {
    let boiling = 212.0;
    // boiling = to_celcius(boiling); This will fail
    let boiling = to_celcius(boiling);
    println!("212 Farenheight is {} Celcius", boiling);
    let mut freezing = 0.0;
    freezing = to_farenheight(freezing);
    println!("0 Celcius is {} Farenheight", freezing)
}
const OFFSET: f32 = 32.0;
fn to_celcius(temp: f32) -> f32 {
    (temp - OFFSET) * (5.0/9.0)
}
fn to_farenheight(temp: f32) -> f32 {
    (temp * (9.0/5.0)) + OFFSET
}

Начиная с переменных «кипячение» и «замораживание». Мы видим, что у нас есть одна изменяемая переменная «замораживание», обозначенная ключевыми словами «пусть мут». Затем у нас также есть одна неизменяемая переменная «кипение», обратите внимание на отсутствие ключевого слова «mut». Существует также смещение постоянного значения, тип которого должен быть явно объявлен.

У нас также есть три функции. Первая функция — это наша основная функция, которая, как и во многих языках, является основной точкой входа в наш код. Затем у нас также есть две чистые функции, которые принимают параметр типа Float 32 и возвращают тот же тип.

Фибоначчи

Наш второй проект имеет четыре различных реализации проверенной временем функции Фибоначчи. В нашем проекте Фибоначчи мы видим несколько способов зацикливания, а также несколько простых ветвлений.

fn main() {
    let number = 5;
println!("Fib 5 recursive is {}", fib_recursive(number));
    println!("Fib 5 looping is {}", fib_looping(&number));
    println!("Fib 5 looping is {}", fib_till(&number));
    println!("Fib 5 looping is {}", fib_while(&number));
}
fn fib_recursive(x: i32) -> i32 {
    if x <= 1 {
        x
    } else {
        fib_recursive(x - 1) + fib_recursive(x - 2)
    }
}
// Pass references to avoid putting new values on the stack
fn fib_looping(x: &i32) -> i32 {
    let mut a = 0;
    let mut b = 1;
    let mut c = 1;
    for _ in 0..x-1 {
        c = a + b;
        a = b;
        b = c;   
    };
    c
}
fn fib_till(x: &i32) -> i32 {
    let mut a = 0;
    let mut b = 1;
    let mut c = 1;
    let mut n = 0;
    loop {
        if n < x - 1 {
            c = a + b;
            a = b;
            b = c; 
            n = n + 1;  
        } else {
            break;
        }
    }
    c
}
fn fib_while(x: &i32) -> i32 {
    let mut a = 0;
    let mut b = 1;
    let mut c = 1;
    let mut n = 0;
    while n < x - 1 {
        c = a + b;
        a = b;
        b = c;
        n = n + 1;   
    }
    c
}

Первый Фибоначчи показывает, как написать рекурсивное Фибоначчи и выражение if. Второй пример Фибоначчи показывает, как использовать цикл for и оператор распространения для итерации. Третий пример Фибоначчи показывает бесконечный цикл, который использует оператор break для выхода из цикла на основе выражения if. Наш окончательный Фибоначчи показывает цикл while. Каждая из этих функций также показывает неявное выражение возврата, которое появляется в конце функции (обратите внимание на преднамеренное отсутствие точки с запятой).

Двенадцать дней Рождества

Наш третий и последний проект — это текст песни «Двенадцать дней Рождества». Этот проект показывает нам некоторые составные типы данных, а также несколько более сложных циклов и ветвлений.

fn main() {
    const DAYS: [(&str, &str); 12] = [
        ("first", "partridge in  a pear tree"),
        ("second", "Two turtle doves"),
        ("third", "Three French hens"),
        ("forth", "Four calling birds"),
        ("fifth", "Five gold rings"),
        ("sixth", "Six geese a laying"),
        ("seventh", "Seven swans a swimming"),
        ("eight", "Eight maids a milking"),
        ("ninth", "Nine ladies dancing"),
        ("tenth", "Ten lords a leaping"),
        ("eleventh", "Eleven pipers piping"),
        ("twelfth", "Twelve drummers drumming")
    ];
    for i in 0..12 {
        println!("On the {} day of Christmas", DAYS[i].0);
        println!("My true love gave to me");
        for j in (0..i + 1).rev() {
            if i == 0 && j == 0 {
                println!("A {}\n", DAYS[j].1);
            } else if j == 0 {
                println!("And a {}\n", DAYS[j].1);
            } else {
                println!("{}", DAYS[j].1);
            }
        }
    };
}

Первое, что мы видим, это постоянный массив кортежей, представляющий собой составной тип (массив), содержащий другой составной тип (кортеж). Также безопасно сделать это постоянным, так как я не думаю, что текст этой песни изменится в ближайшее время. Далее мы видим два вложенных цикла for. Внешний цикл насчитывает до 12, что моделирует повторение песни в течение двенадцати дней. Внутренний цикл ведет обратный отсчет от нашего текущего дня, что моделирует то, как песня повторяет все элементы предыдущего дня каждый день. Последняя часть — это наша ветвящаяся структура, потому что строка для первого элемента может быть либо «куропатка на грушевом дереве», либо «и куропатка на грушевом дереве» в зависимости от того, первый ли это день.

Вот оно. Большинство часто встречающихся структур вы найдете в современных языках программирования. Если у вас есть какие-либо комментарии или проблемы, не стесняйтесь оставлять комментарии, и спасибо!