4.9 控制流 (Control Flow)

if 表达式 (ifexpressions)

Sway supports if, else, and else if expressions that allow you to branch your code depending on conditions.

Sway 支持 ifelseelse if 表达式,允许你根据条件分支代码。

For example: 例如:

fn main() {
    let number = 6;

    if number % 4 == 0 {
        // do something
    } else if number % 3 == 0 {
        // do something else
    } else {
        // do something else
    }
}

let 语句中使用 if (Using if in a let statement)

Like Rust, ifs are expressions in Sway. What this means is you can use if expressions on the right side of a let statement to assign the outcome to a variable.

与 Rust 一样,if 是 Sway 中的表达式。这意味着您可以在 let 语句的右侧使用 if 表达式将结果分配给变量。

let my_data = if some_bool < 10 { foo() } else { bar() };

Note that all branches of the if expression must return a value of the same type.

请注意,if 表达式的所有分支都必须返回相同类型的值。

match 表达式 (match expressions)

Sway supports advanced pattern matching through exhaustive match expressions. Unlike an if statement, a match expression asserts at compile time that all possible patterns have been matched. If you don't handle all the patterns, you will get compiler error indicating that your match expression is non-exhaustive.

Sway 通过详尽的match 匹配表达式支持高级模式匹配。与 if 语句不同,match 表达式断言在编译时**所有可能的模式都已匹配。如果您不处理所有模式,您将收到编译器错误,表明您的match 匹配表达式是非穷尽的。

The basic syntax of a match statement is as follows:

match 语句的基本语法如下:

let result = match expression {
    pattern1 => code_to_execute_if_expression_matches_pattern1,
    pattern2 => code_to_execute_if_expression_matches_pattern2,
    pattern3 | pattern4 => code_to_execute_if_expression_matches_pattern3_or_pattern4
    ...
    _ => code_to_execute_if_expression_matches_no_pattern,
}

Some examples of how you can use a match statement:

有关如何使用匹配语句的一些示例:

script;

// helper functions for our example
fn on_even(num: u64) {
    // do something with even numbers
}
fn on_odd(num: u64) {
    // do something with odd numbers
}

fn main(num: u64) -> u64 {
    // Match as an expression
    let is_even = match num % 2 {
        0 => true,
        _ => false,
    };

    // Match as control flow
    let x = 12;
    match x {
        5 => on_odd(x),
        _ => on_even(x),
    };

    // Match an enum
    enum Weather {
        Sunny: (),
        Rainy: (),
        Cloudy: (),
        Snowy: (),
    }
    let current_weather = Weather::Sunny;
    let avg_temp = match current_weather {
        Weather::Sunny => 80,
        Weather::Rainy => 50,
        Weather::Cloudy => 60,
        Weather::Snowy => 20,
    };

    let is_sunny = match current_weather {
        Weather::Sunny => true,
        Weather::Rainy | Weather::Cloudy | Weather::Snowy => false,
    };

    // match expression used for a return
    let outside_temp = Weather::Sunny;
    match outside_temp {
        Weather::Sunny => 80,
        Weather::Rainy => 50,
        Weather::Cloudy => 60,
        Weather::Snowy => 20,
    }
}

循环 (Loops)

while

Loops in Sway are currently limited to while loops. This is what they look like:

Sway 中的循环目前仅限于while循环。他们看起来像这样:

while counter < 10 {
    counter = counter + 1;
}

You need the while keyword, some condition (value < 10 in this case) which will be evaluated each iteration, and a block of code inside the curly braces ({...}) to execute each iteration.

您需要 while 关键字、每次迭代都会评估的某些条件(在本例中为 value < 10),以及花括号内的代码块({...})来执行每次迭代。

breakcontinuebreak and continue

break and continue keywords are available to use inside the body of a while loop. The purpose of the break statement is to break out of a loop early:

breakcontinue 关键字可在 while 循环体内使用。 break 语句的目的是尽早跳出循环:

fn break_example() -> u64 {
    let mut counter = 1;
    let mut sum = 0;
    let num = 10;
    while true {
        if counter > num {
            break;
        }
        sum += counter;
        counter += 1;
    }
    sum // 1 + 2 + .. + 10 = 55
}

The purpose of the continue statement is to skip a portion of a loop in an iteration and jump directly into the next iteration:

continue 语句的目的是跳过迭代中的一部分循环并直接跳转到下一次迭代:

fn continue_example() -> u64 {
    let mut counter = 0;
    let mut sum = 0;
    let num = 10;
    while counter < num {
        counter += 1;
        if counter % 2 == 0 {
            continue;
        }
        sum += counter;
    }
    sum // 1 + 3 + .. + 9 = 25
}

嵌套循环 (Nested loops)

You can also use nested while loops if needed:

如果需要,您还可以使用嵌套的 while 循环:

while condition_1 == true {
    // do stuff...
    while condition_2 == true {
        // do more stuff...
    }
}

Last updated