Структуры

Структура есть именованный тип, содержащий в себе множество именованных значений различных типов. Дополнительно, структура может содержать ряд функций (в т. ч. специальных), типов, переменных.

Пример объявления структуры:

// Структура с двумя полями
struct SomeStruct
{
    i32 x;
    f32 y;
}

struct EmptyStruct {} // дозволено объявить пустую структуру

// Структура с множеством полей различных типов, в т. ч. массивов и кортежей
struct ComplexStruct
{
    i32 x;
    [ f32, 16 ] arr;
    bool b;
    tup[ i32, f64 ] t;
}

Доступ к полям структур осуществляется с помощью оператора . с именем поля после него.

var SomeStruct mut s= zero_init;
s.x= 5;
s.y= 0.25f;
++s.x;
s.y= f32( s.x );

Функции структур

Структура может иметь функции внутри:

struct SomeStruct
{
    i32 x;
    f32 y;

    fn GetFieldCount() : size_type
    {
        return 2s;
    }
}

В данном примере объявлена обычная свободная функция, хоть она и расположена внутри структуры. Вызвать её можно следующим образом:

var SomeStruct s= zero_init;
auto x= s.GetFieldCount(); // Можно обратиться через переменную типа структуры
auto y= SomeStruct::GetFieldCount(); // А можно и напрямую, не создавая переменной типа структуры

Методы

Методы это функции структур и классов, первый параметр которых называется this. Тип у этого параметра не указывается - он неявно будет иметь тип структуры или класса, в котором объявлен метод. Перед this можно указать опциональный модификатор изменяемости mut или imut, смысл его аналогичен смыслу у других параметров. Параметр с именем this всегда должен быть первым параметром, нельзя называть другие параметры this. Методы можно вызывать только имея переменную типа структуры или класса. Внутри методов можно напрямую обращаться к полям, опуская параметр this.

Пример объявления методов:

struct Rect
{
    u32 w;
    u32 h;

    fn GetArea( this ) : u32
    {
        return w * h; // Поля "w" и "h" здесь относятся к "this"
    }

    // Изменяющий метод, в нём можно изменять поля "this"
    fn SetWidth( mut this, u32 new_w )
    {
            w= new_w;
    }

    fn SetHeight( mut this, u32 new_h )
    {
         this.h= new_h; // Можно обращаться к полям явно, используя "this"
    }
}

Пример использования методов:

var Rect mut rect= zero_init;
rect.SetWidth( 5u );
rect.SetHeight( 8u );
auto area= rect.GetArea();

Прочее содержимое структур

Внутри структуры можно объявлять вложенные типы (структуры, классы, перечисления, псевдонимы), переменные. Получить доступ к ним можно будет так же, как и к элементам пространства имён.