Jump/ru
| LSL Портал | | | Функции | | | События | | | Типы | | | Константы | | | Потоки | | | Библиотека Скриптов | | | Учебники |
Template:Issues/SVC-6712Template:Issues/SCR-256Template:Issues/SVC-1929
Template:Label target;
Template:Label target;| • label | Template:Target | – | Название метки внутри функции или события области видимости. |
@target;
Метка, в которую можно прыгнуть, если скачок в той же области видимости или в младшей (производной) области видимости. Это не возможно для перехода между областями видимости (например, между функциями, событиями или состояниями).
| • label | target |
Caveats
Предостережения
- Только в LSO-режиме скрипта: Если несколько источников скачка высказались за ту же метку цели в пределах видимости, то только первая (сверху вниз, слева направо) будет функционировать как и ожидалось, все остальные по-умолчанию откажут.
- Метки находятся в области видимости при событийном и функциональном уровне, что значит невозможность объявить одинаковые метки в том же событии или функции, даже если метки заключены в другие условные-операторы, циклы и подобное. -- SVC-6712
- Попытка такого использования приведет к бесполезной CIL-сигнла_сборки (assembly) об косяке подключения. -- SCR-256
- Если код существует после возвращения, не инкапсулированного в структуру управления потоком, компилятор выдаст сообщение ошибки о падении кода, даже если код доступен с прыжка. -- SVC-1929
Examples
Примеры <lsl>integer a = 5; jump over; @in; a = 6; @over; llOwnerSay((string)a); if(a < 6)
jump in;
//скрипт будет, скажем, 5, а затем 6</lsl> <lsl> integer getLinkWithName(string name) {
integer i = llGetLinkNumber() != 0; // Начинается с нуля (единственный прим) или 1 (два или более примов)
integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]
for (; i < x; ++i)
{
if (llGetLinkName(i) == name)
jump break; // Нашел! Ранний выход из цикла с результатом
}
i = -1; // Нет примитива (prim) с таким именем, возврат return -1.
@break;
return i;
} </lsl> Чаще всего довольно уродливый "прыжок" можно избежать, особенно в пользовательские функции, как это демонстрирует версия вышеприведенного скрипта <lsl> integer getLinkWithName(string name) {
integer i = llGetLinkNumber() != 0; // Начинается с нуля (единственный прим) или 1 (два или более примов)
integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]
for (; i < x; ++i)
{
if (llGetLinkName(i) == name)
return i; // Нашел его, вернуть его индекс
}
return -1; // Нет примитива (prim) с таким именем, возврат return -1.
} </lsl>
Notes
Заметки
Как правило, считается нецелесообразным использовать скачки (часто называемая GOTO) там, где могут быть использованы другие управляющие структуры.
Deep Notes
LSO VM Notes
Детальные заметки
Глюк многократного скачка
Следующая функция jumpy демонстрирует косяк "несколько прыжков-источников к одной цели". Похоже, здесь функция должна привести к бесконечному циклу, что происходит при компиляции сценария для Mono VM. Однако при компиляции для LSO VM из-за даного глюка второй прыжок никогда не происходит и функция возвращается. LL сообщили, что не желают исправить косяк, чтобы сделать его критическим изменением. Косяк был исправлен в более новой Mono VM.
<lsl>jumpy(){
jump next;//first jump @next; jump next;//второй прыжок - глюк (косяк), оператор никогда не запускается на выполнение return;
}</lsl>