Туториал (Устарел) [VarScript 0.5] Конструкторы и объекты

Статус
Закрыто для дальнейших ответов.

DPOH-VAR

Старожил
Пользователь
Баллы
153
-----------------------------------------------------
Разработка VarScript 0.5 (ссылки на другие уроки, полезные функции, модули и т.д.)
VarScript на dev.bukkit.org (скачать можно тут)
-----------------------------------------------------
Это пятый тутор по плагину VarScript 0.5
В нем рассматриваются технологии создания конструкторов и объектов
Предполагается, что читатель уже достаточно хорошо знаком с плагином и освоил принцип замыканий.

Объекты varscript и работа с ними

Каждый объект в varscript имеет несколько полей ( связок <Ключ-строка, Значение> )
Создать пустой объект можно командой OBJECT
Записать данные в его поля можно несколькими способами:
Perl:
OBJECT        ## создаем пустой объект
10 >>foo      ## записываем ему 10 в поле foo
12 >>bar      ## записываем ему 12 в поле bar
<Map> PRINT   ## распечатать объект в виде {ключ=значение}
Получим на экране {foo=10, bar=12, constructor=FieldableObject{}}
Поле constructor есть у каждого объекта по умолчанию и представляет собой конструктор, с помощью которого был создан объект.
Вот второй вариант заполнения полей объекта
Perl:
OBJECT %%a      ## создаем пустой объект и пишем в переменную a
10 @a.>foo      ## записываем 10 в поле foo объекта a
12 @a.>bar      ## записываем 12 в поле bar объекта a
@a <Map> PRINT  ## распечатать объект a в виде {ключ=значение}
В этом случае объект не лежит постоянно в стеке, а хранится в переменной.
Результат будет аналогичным: {foo=10, bar=12, constructor=FieldableObject{}}
Прочитать значение поля у объекта можно следующей командой:
Perl:
@a.bar PRINT     ## выведет 12


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

Для примера, рассмотрим элемент модуля Helljump, но в упрощенном варианте:
попробуем создать объект - платформу.
Perl:
%Platform{ ## конструктор платформы
 
    ## первый аргумент конвертируется в массив блоков
    ## и записывается в переменную b
    :MAP{<Block>} %%b
 
    $blocks{ ## метод blocks - чтобы прочитать массив блоков
        @b
    }
}
Теперь мы имеем конструктор платформы (внешне он не отличается от обычной функции).
Чтобы создать новый экземпляр, нужно вызвать функцию с помощью команды NEW:
Perl:
-1:0:-1 1:0:1 BOX @Platform NEW %plat
Теперь в переменной plat содержится объект - платформа
В качестве аргумента мы передали конструктору -1:0:-1 1:0:1 BOX
дословно это означает: регион начиная с позиции -1:0:-1 от меня и до 1:0:1 от меня.
Внутри конструктора этот регион конвертируется в массив блоков (строка 5)
И в итоге теперь в переменной b хранится массив из девяти блоков.
Распечатаем объект plat в виде мапы:
Perl:
@plat <Map> PRINT
получим: {blocks=blocks{}, constructor=Platform{}}
Это означает, что объект plat содержит функцию(метод) blocks{} в поле blocks
Функция blocks{} вернет нам список блоков, который хранится в переменной b (строка 8)
Вызвать метод у объекта можно такой командой:
Perl:
@plat:blocks PRINT
В результате мы увидим на экране список из девяти блоков.
Мы не можем изменить значение переменной b внутри объекта, т.к. переменная замкнута внутри конструктора. Однако можем прочитать ее с помощью метода blocks{}
 
Вызов методов и команда THIS

Теперь усложним задачу, добавим методы destroy и regen
Пусть destroy - уничтожает все блоки, а regen - восстанавливает с id = 1
Perl:
%Platform{ ## конструктор платформы
 
    :MAP{<Block>} %%b
 
    $blocks{@b}
 
    $destroy{ ## метод: уничтожить блоки
        THIS:blocks
        :MAP{0 SETBLOCKID} DROP
    }
 
    $regen{ ## метод: восстановить блоки
        THIS:blocks
        :MAP{1 SETBLOCKID} DROP
    }
}
Тут:
строка 7 $destroy - метод для разрушения платформы
строка 11 $regen - метод для восстановления блоков

Команда THIS (строка 8 и 12) позволяет взять объект, для которого вызывается метод. То есть, THIS:blocks вызывает метод blocks у этого же объекта, в результате чего мы получаем массив блоков.
:MAP{0 SETBLOCKID} DROP - для каждого блока из массива: заменить его на воздух
:MAP{1 SETBLOCKID} DROP - для каждого блока из массива: заменить его на камень

Вызвать конструктор и создать объект можно как и в предыдущем случае:
Perl:
-1:0:-1 1:0:1 BOX @Platform NEW %plat
Но теперь объект plat будет содержать еще два дополнительных метода, которые можно так же легко использовать
Perl:
@plat:destroy  ## уничтожить платформу
@plat:regen    ## восстановить платформу


Значения полей по умолчанию

Можно конструктору указать, чтобы он при создании объекта задавал значения полей:
Perl:
ExampleConstructor{
    10 $foo
    12 $bar
}
Если с помощью этого конструктора создать новый объект, то у него будут уже заданы поля foo и bar.
То же самое можно сделать при помощи команды THIS:
Perl:
ExampleConstructor{
    10 THIS.>foo
    12 THIS.>bar
}
Или таким способом:
Perl:
ExampleConstructor{
    THIS
    10 >>foo
    12 >>bar
    DROP
}
Создать новый объект с помощью конструктора и распечатать можно так:
Perl:
@ExampleConstructor NEW <Map> PRINT
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх