Поток управления

В Ü существует ряд конструкций по управлению потоком управления.

Условия

Оператор if позволяет выполнить какой-либо участок кода только при выполнение какого-то условия. Условие в операторе if должно иметь тип bool.

if( x > y )
{
    ++x;
}

Можно указать действие, которое будет выполнено в случае, если условие не выполнилось:

if( x > y )
{
    ++x;
}
else
{
    ++y;
}

Можно указать несколько условий и действий при их выполнении:

if( x > y )
{
    ++x;
}
else if( y > x )
{
    ++y;
}
else if( z )
{
    return;
}
else
{
    ++x;
    ++y;
}

Статические условия

Существует особый вид условного оператора - static_if. Он принимает только constexpr выражения в качестве условий. Соотвественно, какая ветвь условия будет выполнятся - определяется статически, при компиляции. Ветви, которые не должны исполняться, компилироваться не вообще будут.

static_if( typeinfo</size_type/>.size_of == 8s )
{
    return 0; // Скомпилируется или эта ветвь
}
else if( typeinfo</size_type/>.size_of == 4s )
{
    return 1; // Или эта
}
else
{
    // В экзотических случаях может скомпилироваться и эта ветвь
    static_assert(false); // но компиляция упадёт на этом ассерте
    halt;
}

Циклы

Оператор while позволяет выполнять какие-либо действия, пока условие истинно. Условие в операторе while должно иметь тип bool.

while( x > 0 )
{
    --x;
}

Можно выйти из цикла преждевременно, используя оператор break:

while( x > 0 )
{
    x /= 5;
    if( x == 1 )
    {
        break;
    }
}

Можно перейти к следующей итерации цикла, используя оператор continue:

while( x > 0 )
{
    x /= 3;
    if( x == 5 )
    {
        continue;
    }
    --x;
}

Возврат из функции

Исполнение функции, не возвращающей значение, заканчивается, когда поток исполнения достигает конца тела функции. Если зачем-то нужно завершить исполнение функции раньше, можно использовать оператор return.

fn Clamp( i32 &mut x )
{
    if( x >= 0 )
    {
        return;
    }
    x= 0;
}

Функции, возвращающие значения, должны завершаться во всех случаях оператором return со значением. Тип значения в операторе return должен совпадать с типом возвращаемого значения функции.

fn Add( i32 x, i32 y ) : i32
{
    return x + y;
}

Компилятор проверяет, во всех ли случаях функция возвращает значение, и, если это не так, будет порождена ошибка.

fn Clamp( i32 &mut x ) : bool
{
    if( x >= 0 )
    {
        return false;
    }
    x= 0;
    // Ошибка, функция возвращает значение не во всех случаях.
}
fn Clamp( i32 &mut x ) : bool
{
    if( x >= 0 )
    {
        return false;
    }
    else
    {
        x= 0;
        return true;
    }
    // Всё в порядке, функция возвращает значение всегда
}