基本問題:偶数だけの合計
[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
12Result問題:安全な割り算
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では割れません")所有権問題:値を渡す方法を比べる
Stringをそのまま受け取る関数、&strを受け取る関数、cloneして渡す関数を作り、呼び出し元の値をその後も使えるか確認してください。
確認ポイント
Stringを値で渡すと所有権が移る&strなら所有権を移さず読めるcloneはデータを複製するためコストがある
テスト問題:境界値を確認する
偶数合計関数に対し、空の配列、すべて奇数、負数を含むケースを#[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を実行し、通常の入力だけでなく失敗ケースや空の入力を確認する習慣をつけましょう。