Conditionals
Conditionals in Motoko come in two forms: if-expressions and if-statements.
if-else
Section titled “if-else”An if-else expression, if <c> <b1> else <b2>, has three parts:
- A condition
<c>that evaluates to a boolean value. - Two branches
<b1>and<b2>. These branches can be simple expressions or blocks{ ... }.
If the condition is true, the first branch <b1> is evaluated to produce the result of the if-else.
If the conditions is false, the second branch <b2> is evaluated to produce the result of if-else.
Only one of the branches is evaluated.
The type of theif-else is the type of <b1> and <b2> if they have the same type; otherwise, it is a more general type that is a supertype of their types.
For example, you might use an if-else to choose a label based on a value.
let x : Int = 1;
let identity : Text = if (x == 1) { "x is 1" } else { "x is not 1" }; // Produces a valueThe result of the if-else is assigned to identity. Here, both branches have the same type (Text in this case) as does the entire if-else.
let n : Nat = 0;let parity = if (n % 2 == 0) #even else #odd;Here, the first branch has type {#even} and the second branch has type {#odd}. These types are different but they have a common supertype {#even; #odd}. The type of the if-else is then {#even; #odd}.
Motoko will infer the common supertype for you, choosing the most specific one possible. If the types are inconsistent and only have the useless common supertype Any, Motoko will issue a warning:
let n : Nat = 0;let oops = if (n % 2 == 0) #even else 0;if-expression
Section titled “if-expression”An if-expression takes the form if <c> <b1> and is like an if-else but omits the else and second branch else <b2>.
An if-expression is used purely for its side effects to conditionally evaluate a single branch when the condition is true, and do nothing otherwise. It returns the trivial value (), and its type is ().
if-expressions are best suited for situations where you need to perform conditional actions, such as logging or modifying state based on certain conditions.
Since if-expressions have type (), they can be used as declaration expressions.
let x : Int = 1;
if (x == 1) { Debug.print("x is 1"); // Prints and returns ()};Nesting if-else expressions
Section titled “Nesting if-else expressions”if-else expressions can be nested and associate to the right. This ensures the following code works as intended and the second else belongs to the second, nested if.
var age = 21;
if (age < 18) { "You are a minor."} else if (age >= 18 and age < 65) { "You are an adult."} else { "You are a senior citizen."};