PDA

Просмотр полной версии : [Урок] Оператор tagof



VVWVV
30.12.2016, 02:29
Привет!

В этом уроке я попытаюсь объяснить вам работу оператора tagof. Удивительно, но копаясь на форуме, не заметил ни одной статьи посвященный данному оператору.

Перед тем как начать изучать работу данного оператора давайте разберёмся, для чего он нужен и где его использовать?

Дело в том, что частота использования данного оператора в библиотеках выше, чем в скриптах. Это обуславливается тем, что он необходим только для определения тега у константы, переменной или функции. Поэтому вы вряд ли встретите его в каком-либо скрипте/моде.


Влияет ли он на скорость?

Он вычисляется на этапе компиляции. Таким образом, можно утверждать, что код не может быть медленнее или быстрее из-за константного числа.


Как же использовать данный оператор?

Оператор прост в использовании. Например, для определения идентификатор тега, после названия тега необходимо указать двоеточие. Для функций, переменных, констант ничего указывать не надо.

Давайте рассмотрим пример:

stock SomeFunction({bool,_}:var1, tag = tagof(var1))
{
if (tagof(bool:) == tag) {
print("boolean");
} else if(tagof(_:) == tag) {
print("int");
} else {

}
}

Таким образом, при вызове функции, например, со значением и тегом bool, нам выведет сообщение "boolean". Если же мы укажем, например, цифру или переменную без тега, то получим сообщение "int".


Существуют ли баги?

К сожалению, баги есть и они не исправлены в версии 3.x (Thanks Kalcor).

На данный момент, я знаю лишь два бага связанных с данным оператором:

При указании tagof в метке конструкции switch будет ошибка.



// Ошибочный код.
switch (...)
{
case tagof(var1):
{}
}

Для того чтобы избежать данную ошибку необходимо обособить данный оператор круглыми скобками:


// Правильный код.
switch (...)
{
case (tagof(var1)):
{}
}

Примечание: в версиях 4.x это было исправлено (другие исправления новых версий (http://pro-pawn.ru/showthread.php?14214))


Ошибка при указании оператора tagof без круглых скобок.

Очень странно, но при использовании оператора sizeof такой проблемы не наблюдается:


new size = sizeof array;






Автор: VVWVV (http://pro-pawn.ru/member.php?4348)
Исключительно для pro-pawn.ru


Копирование данной статьи на других ресурсах без разрешения автора запрещено!

Nexius_Tailer
30.12.2016, 03:44
Хорошая статья! Всяко лучше, чем искать подобное описание в огромном .pdf на английском)
Для пваров, кстати, подобное выполняет функция GetPVarType, можно как интересные сноски добавить (хотя, наверное, немного не по теме самого оператора будет).

Кстати, небольшая помарочка: "другие исправления новых версий"

VVWVV
30.12.2016, 03:47
Кстати, небольшая помарочка: "другие исправления новых версий"

Исправил.

$continue$
30.12.2016, 05:19
Стас же объяснял его работу. (http://pro-pawn.ru/showthread.php?12257-%D0%9F%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D0%B2-Pawn&highlight=tagof)

VVWVV
30.12.2016, 05:31
Стас же объяснял его работу. (http://pro-pawn.ru/showthread.php?12257-%D0%9F%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D0%B2-Pawn&highlight=tagof)

Оу... Вот что значит не пользоваться поиском (это я про себя)

UPD: Lol, я даже там что-то комментировал.

DeimoS
30.12.2016, 10:39
Стас же объяснял его работу. (http://pro-pawn.ru/showthread.php?12257-%D0%9F%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D0%B2-Pawn&highlight=tagof)

Вряд ли кто-то, кто будет искать информацию именно о tagof, сможет наткнуться на статью Кортеза, если не будет пользоваться поиском и открывать все темы, что выдаст его запрос. Так что, думаю, эта тема имеет место быть

middlematt
31.12.2016, 01:57
Понятнее тут, чем в этой теме (http://pro-pawn.ru/showthread.php?12257-Перегрузка-функций-в-Pawn&highlight=tagof).

Храни тебя господь. c:

KrutoyKrosch
01.01.2017, 05:44
Может мне, деревенщине, кто то объяснит зачем годноту выкладывать на форум где сидят "профессионалы" (никогда кавычки зря не ставлю, это принцип)? Все таки может добавить менее эксклюзивности твоим урокам?

vovandolg
01.01.2017, 11:36
О, а можно ведь с её помощью годный SendMessageFormated написать?

DeimoS
01.01.2017, 15:04
О, а можно ведь с её помощью годный SendMessageFormated написать?

Каков в твоём понимании "годный" SendFormatMessage? Если не крашащий сервер, то можно и без этого оператора написать (сделать форматирование по типу функции SetTimerEx, где указывается форматирование данных по типу "ssddffii"), но это всё будет очень медленно и костыльно, в отличии от format+SendClientMessage