10.05.2013, 14:44
(
Last edited by ZiGGi; 12/09/2018 at 12:00 AM.
)
В языке Pawn есть механизм состояний(автоматон) - это такая система, которая позволяет определить несколько копий одной функции для использования в различных условиях. Я начну объяснять с примера, ибо так получится более наглядно, а ниже подробно опишу эту систему.
Пример
Допустим нам нужно сохранить данные игрока и данные гонок, а также сообщить об этом игрокам и гонщикам соответственно. При обычной реализации код выглядит грязновато:
А реализация с помощью автоматонов выглядит очень элегантно:
Плюсы этого метода
А если понадобится добавить в список выше что-нибудь ещё? Код без автоматонов превратиться в огромный switch! А если вы, например, захотите перенести код сохранения данных гонки в файл race/data.inc? Тогда вам придётся создавать дополнительную функцию и заносить её туда! Но с автоматонами это делается гораздо проще.
Ещё можно отметить то, что конструкция, выполненная с помощью автоматонов, работает немного быстрее, чем функция с большим switch.
Теория
state
Этим кодом мы устанавливаем для dataType состояние players
Для проверок, связанных с автоматонами, есть сокращённое написание, например этот код:
эквивалентен этому:
entry()
Для автоматонов зарезервирована специальная функция entry(), которая вызывается при установке состояния.
Пример:
Результатом выполнения этого кода будет:
Функции
Вы можете объявлять функции с одним состоянием:
С несколькими:
(эта функция будет вызвана при состоянии one или two).
И с любым другим состоянием:
(эта функция будет вызвана если не было вызвано ни одной функции со своим состоянием).
Источник
Пример
Допустим нам нужно сохранить данные игрока и данные гонок, а также сообщить об этом игрокам и гонщикам соответственно. При обычной реализации код выглядит грязновато:
Code:
#include forward data_Save(type); forward message_Save(type); enum { players, races } main() { data_Save(players); message_Save(players); } public data_Save(type) { switch (type) { case players: { // saving } case races: { // saving } } } public message_Save(type) { switch (type) { case players: { // send message to player } case races: { // send message to racers } } }
Code:
#include forward data_Save(); forward message_Save(); main() { state dataType:players; data_Save(); message_Save(); } public data_Save() { // saving } public data_Save() { // saving } public message_Save() { // send message to players } public message_Save() { // send message to racers }
А если понадобится добавить в список выше что-нибудь ещё? Код без автоматонов превратиться в огромный switch! А если вы, например, захотите перенести код сохранения данных гонки в файл race/data.inc? Тогда вам придётся создавать дополнительную функцию и заносить её туда! Но с автоматонами это делается гораздо проще.
Ещё можно отметить то, что конструкция, выполненная с помощью автоматонов, работает немного быстрее, чем функция с большим switch.
Теория
state
Этим кодом мы устанавливаем для dataType состояние players
Code:
state dataType:players;
Code:
state (var == 1) dataType:races;
Code:
if (var == 1) { state dataType:races; }
Для автоматонов зарезервирована специальная функция entry(), которая вызывается при установке состояния.
Пример:
Code:
#include main() { printf("Hello"); state entryTest:message; printf("World!"); } entry() { printf("Test"); }
Code:
Hello Test World
Вы можете объявлять функции с одним состоянием:
Code:
stock echo(msg[]) <exType:one> { print(msg); }
Code:
stock echo(msg[]) <exType:one,exType:two> { print(msg); }
И с любым другим состоянием:
Code:
stock echo(msg[]) <> { print(msg); }
Источник