Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

条件分支(if / else)

Move 使用 if/else 实现条件分支。与许多语言不同,Move 中的 if/else表达式,可以返回值,两个分支的返回类型必须一致。

基本语法

if 表达式根据布尔条件选择执行路径:

module book::if_basic;

public fun is_positive(n: u64): bool {
    if (n > 0) {
        true
    } else {
        false
    }
}

#[test]
fun if_positive() {
    assert!(is_positive(10));
    assert!(!is_positive(0));
}

作为表达式使用

if/else 可以返回值,此时两个分支的返回类型必须一致:

module book::if_expression;

public fun abs_diff(a: u64, b: u64): u64 {
    if (a > b) { a - b } else { b - a }
}

public fun max(a: u64, b: u64): u64 {
    if (a >= b) { a } else { b }
}

public fun describe(n: u64): vector<u8> {
    if (n == 0) {
        b"zero"
    } else if (n < 10) {
        b"small"
    } else if (n < 100) {
        b"medium"
    } else {
        b"large"
    }
}

#[test]
fun expression_if() {
    assert_eq!(abs_diff(10, 3), 7);
    assert_eq!(max(5, 8), 8);
    assert_eq!(describe(0), b"zero");
    assert_eq!(describe(5), b"small");
    assert_eq!(describe(50), b"medium");
    assert_eq!(describe(200), b"large");
}

无 else 分支

if 不作为表达式使用时(即不返回值),可以省略 else 分支:

module book::if_no_else;

#[test]
fun no_else() {
    let mut result = 0u64;
    let condition = true;

    if (condition) {
        result = 42;
    };

    assert_eq!(result, 42);
}

小结

  • if/else:条件分支,可作为表达式返回值
  • 分支类型:作为表达式时,两个分支的返回类型必须一致
  • 无 else:不返回值时可以省略 else