Rectangle
type Rectangle =
inherit Control
val memory@atom = (width@atom, height@atom)
|> to_atom
|> map { w, h ->
let quad = Quad.create
up_left = Vector3 0 0 0
up_right = Vector3 w.as<f32> 0 0
down_left = Vector3 0 h.as<f32> 0
down_right = Vector3 w.as<f32> h.as<f32> 0
MeshMemory.from_quad quad }
Прямоугольник хранит в себе геометрическую форму, созданную исходя из его ширины и высоты.
to_atom
преобразовывает кортеж атомов в атом кортежей.
Из-за модификатора @atom
привязка memory
имеет тип MeshMemory
, а не Atom<MeshMemory>
.
type Control
var maybe_drawable : Option<Drawable> @mut = None
Единица упаковки кода называется ящик.
Тип Rectangle
определён в ящике control
, отвечающем за внутреннюю логику элементов управления. Последний же фрагмент кода находится в ящике drawer
, который выводит пользовательский интерфейс на экран и зависит от конкретного отрисовщика, частью которого является Drawable
.
type Rectangle
let materials : Materials @auto
val drawable = Drawable
material = materials.ui
mesh = Mesh.from_memory memory@atom
maybe_drawable = drawable
Поле materials
получает значение автоматически благодаря атрибуту @auto
. Далее оно используется при создании объекта Drawable
.
let materials @publish = app.drawer.materials
let rectangle = Rectangle.new
materials
опубликовано для передачи значения в зависимые от него объекты и функции.
Именно автоматическая передача объектов в конструктор Rectangle
это не только вопрос снижения сложности. В других ящиках может находиться код, создающий Rectangle
, но ничего не знающий о зависимостях, которые он получил в ящике drawer
. Весь этот код продолжит работать, но теперь при вызове будет требовать предварительно опубликованного materials
.