Руст, вычисления НОД: модульность, ссылки


Это мой первый раз пытается ржавчины. Я написал этот код для вычисления большего общего делителя 2-х целых чисел. Любые советы, чтобы улучшить его? Я используя модульность/ссылка/одолжить/разыменования правильный путь?

Файл src/gcd.rs:

// calculate the gcd of two integers
// https://en.wikipedia.org/wiki/Greatest_common_divisor

pub fn gcd(a: &i64, b: &i64) -> i64 {
    let mut _a = *a;
    let mut _b = *b;
    while _b != 0 {
        let tmp = _a;
        _a = _b;
        _b = tmp % _b;
    }
    _a
}

#[cfg(test)]
mod tests {
    use ::gcd;

    #[test]
    fn test_gcd() {
        assert_eq!(gcd::gcd(&60, &168), 12);
        assert_eq!(gcd::gcd(&1071, &1029), 21);
    }
}

Файл src/main.rs:

mod gcd;

fn main() {
    println!("gcd({}, {}) = {}", 60, 168, gcd::gcd(&60, &168)); 
}

Структура каталогов:

$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── gcd.rs
│   └── main.rs
└── target
    ├── ...


200
3
задан 30 января 2018 в 06:01 Источник Поделиться
Комментарии
1 ответ


  1. Вам не нужно брать цифры по ссылке.

  2. Вообще не ставить знак подчеркивания в начале имени переменной. Имя переменной начинается с _ используется, чтобы сказать компилятору, что переменная не используется.

В противном случае, я не вижу никаких проблем в коде. Вот решение с учетом моих замечаний:

pub fn gcd(mut a: i64, mut b: i64) -> i64 {
while b != 0 {
let tmp = a;
a = b;
b = tmp % b;
}
a
}

#[cfg(test)]
mod tests {
use ::gcd;

#[test]
fn test_gcd() {
assert_eq!(gcd(60, 168), 12);
assert_eq!(gcd(1071, 1029), 21);
}
}

Дополнительные разъяснения:


Почему мне нужно использовать let a = вместо let mut a = когда зовешь его?

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


Какой тип переменных должен и не должен быть передан по ссылке?

Это очень широкий вопрос. Я советую вам думать вещи по-другому. В Rust, вы можете отдать вещь, или только кредитовать его (всего заемные). Общий ответ таков: если вам не нужны вещи, или если приемник нужен полный контроль над ней, отдать его.

В данном конкретном случае, вещь можно копировать и маленький (как маленький, в самом деле). Так, одолжить это не дает никаких преимуществ: просто возьми (или сделай копию) и не заморачиваться со ссылками.

2
ответ дан 31 января 2018 в 11:01 Источник Поделиться