Rust

Rust練習問題

答えを見る前にコードを書き、入力値を変えてRustの考え方を定着させましょう。

Rust入門の講座一覧

01

基本問題:偶数だけの合計

[3, 4, 8, 11]から偶数だけを取り出して合計し、12を表示する関数を作ってください。

解答例と実行結果
RUSTCODE
fn even_sum(numbers: &[i32]) -> i32 {
    numbers.iter().copied().filter(|number| number % 2 == 0).sum()
}

fn main() {
    println!("{}", even_sum(&[3, 4, 8, 11]));
}
実行結果OUTPUT
12
02

Result問題:安全な割り算

0で割る場合はErr、それ以外は商を返すdivide関数を作ってください。

解答例と実行結果
RUSTCODE
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
    if b == 0 { Err("0では割れません") } else { Ok(a / b) }
}

fn main() {
    println!("{:?}", divide(10, 0));
}
実行結果OUTPUT
Err("0では割れません")
03

所有権問題:値を渡す方法を比べる

Stringをそのまま受け取る関数、&strを受け取る関数、cloneして渡す関数を作り、呼び出し元の値をその後も使えるか確認してください。

確認ポイント
  • Stringを値で渡すと所有権が移る
  • &strなら所有権を移さず読める
  • cloneはデータを複製するためコストがある
04

テスト問題:境界値を確認する

偶数合計関数に対し、空の配列、すべて奇数、負数を含むケースを#[test]で確認してください。

テスト例RUST
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn edge_cases() {
        assert_eq!(even_sum(&[]), 0);
        assert_eq!(even_sum(&[1, 3]), 0);
        assert_eq!(even_sum(&[-4, 3, 6]), 2);
    }
}

cargo testを実行し、通常の入力だけでなく失敗ケースや空の入力を確認する習慣をつけましょう。