Properties

Properties are type members that externally look like fields, but internally behave like methods.

struct Vec {
    x;
    y;

    Length {
        get => (x * x + y * y) ** 0.5;
        set(new_length) {
            let k = new_length / Length;
            x = x * k;
            y = y * k;
        }
    }
}

let v = Vec :{ x: 3, y: 4 };
print(v.Length); // 5

v.Length = 1;

print(v); // Vec { x: 0.6, y: 0.8 }

In this example, Vec has a "property" Length that is easily computable from other fields. Like methods, properties can access fields, methods and other properties of the object. (new_length) can be omitted, in which case the default identifier value is used. Properties can be static. Also, there is no need to implement get and set every time.

class Time {
    static time = 0;

    pub static Now {
        get { time } // this is equivalent to `get => time;`
    }
}

print(Time.Now);

In this example, imagine game engine. Static field time is updated by game engine every frame, and public property Now can be used to get current time on the user side.