• if let
    • 参见:

    if let

    在一些例子中,match 使用起来并不优雅。比如:

    1. // 将 `optional` 定为 `Option<i32>` 类型
    2. let optional = Some(7);
    3. match optional {
    4. Some(i) => {
    5. println!("This is a really long string and `{:?}`", i);
    6. // ^ 行首需要2个缩进,就这样可以从 option 类型中对 `i`
    7. // 进行解构
    8. },
    9. _ => {},
    10. // ^ 必需内容,因为 `match` 需要覆盖全部情况。难道不觉得冗余吗?
    11. };

    if let 对这样的用法要简洁得多,并且允许指明特定的各种不同的失败可选项
    内容(options):

    1. fn main() {
    2. // 全部都是 `Option<i32>` 类型
    3. let number = Some(7);
    4. let letter: Option<i32> = None;
    5. let emoticon: Option<i32> = None;
    6. // `if let` 结构解读:若 `let` 将 `number` 解构成 `Some(i)`,则执行
    7. // 语句块(`{}`)
    8. if let Some(i) = number {
    9. println!("Matched {:?}!", i);
    10. }
    11. // 如果要指明失败情形,就使用 else:
    12. if let Some(i) = letter {
    13. println!("Matched {:?}!", i);
    14. } else {
    15. // 解构失败。换到失败情形(Change to the failure case)。
    16. println!("Didn't match a number. Let's go with a letter!");
    17. };
    18. // 提供一个改变的失败条件(Provide an altered failing condition)。
    19. let i_like_letters = false;
    20. if let Some(i) = emoticon {
    21. println!("Matched {:?}!", i);
    22. // 解构失败。执行 `else if` 条件来判断轮到的失败分支是否需要执行
    23. } else if i_like_letters {
    24. println!("Didn't match a number. Let's go with a letter!");
    25. } else {
    26. // 条件执行错误。这是默认的分支:
    27. println!("I don't like letters. Let's go with an emoticon :)!");
    28. };
    29. }

    参见:

    枚举Option,和 RFC