Skip to content
On this page

Option 1: exercises/options/options1.rs

题目

rust
// options1.rs
//
// Execute `rustlings hint options1` or use the `hint` watch subcommand for a
// hint.

// I AM NOT DONE

// This function returns how much icecream there is left in the fridge.
// If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them
// all, so there'll be no more left :(
fn maybe_icecream(time_of_day: u16) -> Option<u16> {
    // We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a
    // value of 0 The Option output should gracefully handle cases where
    // time_of_day > 23.
    // TODO: Complete the function body - remember to return an Option!
    ???
}

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

    #[test]
    fn check_icecream() {
        assert_eq!(maybe_icecream(9), Some(5));
        assert_eq!(maybe_icecream(10), Some(5));
        assert_eq!(maybe_icecream(23), Some(0));
        assert_eq!(maybe_icecream(22), Some(0));
        assert_eq!(maybe_icecream(25), None);
    }

    #[test]
    fn raw_value() {
        // TODO: Fix this test. How do you get at the value contained in the
        // Option?
        let icecreams = maybe_icecream(12);
        assert_eq!(icecreams, 5);
    }
}

题目解析

先来看函数maybe_icecream的注释,了解到这个函数用于返回冰箱里面还剩多少冰淇淋:

  • 如果是晚上10点之前,剩下5件
  • 晚上10点以后,有人会吃掉它们,所以不会有剩余的。
  • 参数time_of_day采用24小时制

再来看单元测试的代码:

  • 9点返回5,10点返回5,23点返回0,22点返回0
  • 由于是24小时的,25不是一个合法的时间,返回了None。
rust
fn maybe_icecream(time_of_day: u16) -> Option<u16> {
    // We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a
    // value of 0 The Option output should gracefully handle cases where
    // time_of_day > 23.
    // TODO: Complete the function body - remember to return an Option!
    if time_of_day < 22 {  
        Some(5) 
    } else if time_of_day <= 23 { 
        Some(0) 
    } else { 
        None 
    } 
}

对于第二段单元测试的代码,由于maybe_icecream返回的是Option<u16>类型,如果要跟5比较,需要unwrap()

rust
#[test]
    fn raw_value() {
        // TODO: Fix this test. How do you get at the value contained in the
        // Option?
        let icecreams = maybe_icecream(12); 
        let icecreams = maybe_icecream(12).unwrap(); 
        assert_eq!(icecreams, 5);
    }

参考资料

Powered by VitePress