iterators3.rs (1935B)
1 #[derive(Debug, PartialEq, Eq)] 2 enum DivisionError { 3 // Example: 42 / 0 4 DivideByZero, 5 // Only case for `i64`: `i64::MIN / -1` because the result is `i64::MAX + 1` 6 IntegerOverflow, 7 // Example: 5 / 2 = 2.5 8 NotDivisible, 9 } 10 11 // TODO: Calculate `a` divided by `b` if `a` is evenly divisible by `b`. 12 // Otherwise, return a suitable error. 13 fn divide(a: i64, b: i64) -> Result<i64, DivisionError> { 14 todo!(); 15 } 16 17 // TODO: Add the correct return type and complete the function body. 18 // Desired output: `Ok([1, 11, 1426, 3])` 19 fn result_with_list() { 20 let numbers = [27, 297, 38502, 81]; 21 let division_results = numbers.into_iter().map(|n| divide(n, 27)); 22 } 23 24 // TODO: Add the correct return type and complete the function body. 25 // Desired output: `[Ok(1), Ok(11), Ok(1426), Ok(3)]` 26 fn list_of_results() { 27 let numbers = [27, 297, 38502, 81]; 28 let division_results = numbers.into_iter().map(|n| divide(n, 27)); 29 } 30 31 fn main() { 32 // You can optionally experiment here. 33 } 34 35 #[cfg(test)] 36 mod tests { 37 use super::*; 38 39 #[test] 40 fn test_success() { 41 assert_eq!(divide(81, 9), Ok(9)); 42 assert_eq!(divide(81, -1), Ok(-81)); 43 assert_eq!(divide(i64::MIN, i64::MIN), Ok(1)); 44 } 45 46 #[test] 47 fn test_divide_by_0() { 48 assert_eq!(divide(81, 0), Err(DivisionError::DivideByZero)); 49 } 50 51 #[test] 52 fn test_integer_overflow() { 53 assert_eq!(divide(i64::MIN, -1), Err(DivisionError::IntegerOverflow)); 54 } 55 56 #[test] 57 fn test_not_divisible() { 58 assert_eq!(divide(81, 6), Err(DivisionError::NotDivisible)); 59 } 60 61 #[test] 62 fn test_divide_0_by_something() { 63 assert_eq!(divide(0, 81), Ok(0)); 64 } 65 66 #[test] 67 fn test_result_with_list() { 68 assert_eq!(result_with_list().unwrap(), [1, 11, 1426, 3]); 69 } 70 71 #[test] 72 fn test_list_of_results() { 73 assert_eq!(list_of_results(), [Ok(1), Ok(11), Ok(1426), Ok(3)]); 74 } 75 }