Урок оператор повернення (return)

* Даний оператор має два важливих застосування:

По перше. як було сказано вище, він забезпечує негайний вихід з функції, тобто змушує віртуальну машину передати управління коду, який викликав функцію.
По-друге. цей оператор можна використовувати для того, щоб повернути певне значення в код (функцію), з якого була викликана поточна, перервана функція.


* Формат оператора return

return значення; // Де "значення" є необов'язковим

• Для чого ж потрібен цей вихід з функції:

Перш за все, за допомогою даного оператора, ми можемо керувати діями віртуальної машини при виконанні коду. Наприклад, нам не потрібно виконувати певний код функції, якщо у гравця немає на руках 5000 $. Тут то нам і прийде на допомогу даний оператор. Але це ще не все.


Припустимо, у нас є подібний, не самий якісний в плані структури, код команд

public OnPlayerCommandText (playerid. cmdtext # 91; # 93;)
if (! strcmp ( "/ команда_1". cmdtext. true))
SetPlayerHealth (playerid. 98304);
SendClientMessage (playerid. 0xFF0000FF. "Тепер ваше здоров'я блимає: 3");
>
if (! strcmp ( "/ команда_2". cmdtext. true))
printf ( "Продам гараж");
>
if (! strcmp ( "/ команда_3". cmdtext. true))
Ban (playerid);
>
if (! strcmp ( "/ команда_4". cmdtext. true))
Kick (playerid);
>
return 1;
>

А ось як код повинен виглядати

public OnPlayerCommandText (playerid. cmdtext # 91; # 93;)
if (! strcmp ( "/ команда_1". cmdtext. true))
SetPlayerHealth (playerid. 98304);
SendClientMessage (playerid. 0xFF0000FF. "Тепер ваше здоров'я блимає: 3");
return 1;
>
else if (! strcmp ( "/ команда_2". cmdtext. true))
printf ( "Продам гараж");
return 1;
>
else if (! strcmp ( "/ команда_3". cmdtext. true))
Ban (playerid);
return 1;
>
else if (! strcmp ( "/ команда_4". cmdtext. true))
Kick (playerid);
return 1;
>
return 0;
>

Але ці обидва варіанти будуть працювати практично однаково (не рахуючи того, що в першому випадку ми повернули в колбек одиницю, щоб позбутися від повідомлення "Unknown command" (Про реакцію деяких колбекков на повернення поговоримо трохи пізніше) і того, про що я напишу далі ). тоді в чому різниця, запитаєте Ви?

А різниця саме в тому, що в першому випадку, знайшовши команду і виконавши її код, ми не сигналізуючи віртуальній машині (серверу) про те, що він знайшов весь код, який нам потрібно було знайти (в даному випадку код, розташований в блоці умови (команду)). А раз ми не дали чітких вказівок з приводу того, де потрібно зупинити виконання коду, віртуальна машина продовжить перебирати весь код, розташований в колбеке (до дужки закриття блоку колбека), адже машина не знає Ваших думок і виконує все так, як вказали їй Ви .

У другому ж випадку ми:
  1. Склали правильно умови.

Що за нісенітниця несе цей недоумкуватий?

Однакових команд не може бути, тому найвдаліше компілятору вказати перевіряти кожну команду по черзі, поки він не знайде потрібну. Тобто при виконанні однієї з умов наступні умови відкидаються, так як ми використовували інший оператор - else (інакше). Ось так, приблизно, виглядає структура подібного умови:

яблуко зелене?
да
>
немає. а зараз яблуко зелене. // Якщо спрацювало, наприклад, ця умова
да // Значить яблуко зелене
>
немає. а зараз яблуко зелене. // Яблуко вже зелене і значить, що ця перевірка не має сенсу => її можна відкинути
да
>
небо блакитне. // А ось ця перевірка вже буде працювати, якщо ми не вкажемо для неї оператор else і не будемо використовувати в верхніх умовах оператор повернення. В даному випадку, якщо після виконання умов вище нам потрібно виконати і це умови, вище return ставити не потрібно, адже нам не потрібно припиняти виконання коду, якщо яблуко зелене
Так
>


  • Вказали компілятору "кордону" кожного з умов з розрахунком на те, що, після виконання команд, ніякого іншого потрібного коду в блоці колбека (нижче нашої команди) немає і що потрібно виконати код саме до цієї самої "межі".
  • Всім цим ми звільнили віртуальну машину від виконання непотрібних дій (в першому випадку, навіть після знаходження потрібної команди, АМХ машина продовжив би виконання умов, продовжуючи пошук вже знайденої команди). отже АМХ машина швидше розбереться з кодом команди і швидше почне обробляти інший код. Це і називається оптимізацією;)


    Іншими словами, даний оператор дозволяє формувати перевірки в більш зрозумілий для скриптер вид. Погодьтеся, набагато зручніше зрозуміти сенс такого умови

    if (! IsPlayerConnected (playerid)) return printf ( "Гравець з ID. оффлайн". playerid);

    Дана перевірка може виглядати і так:

    Всі інші події не мають особливої ​​прив'язки до повертається значенням, різниця лише в тому що:
    1 подія полность обривається.
    0- подія передається і обробляється усіма скриптами.

    Події в яких можна взагалі ні чого не повертати (можливі Варнінг компілятора):

    • OnVehicleStreamIn
    • OnVehicleStreamOut
    • OnPlayerStreamIn
    • OnPlayerStreamOut
    • OnDialogResponse
    • OnPlayerClickPlayer
    • OnPlayerSelectedMenuRow
    • OnPlayerExitedMenu
    • OnRconLoginAttempt
    • OnVehicleDamageStatusUpdate
    • OnVehiclePaintjob
    • OnVehicleRespray
    • OnVehicleMod


    Таким чином, при поверненнях в даних колбеках, потрібно враховувати ці дані, щоб отримати бажаний результат.

    Так само варто зауважити, що і функції можливо повернути в якості значення. Точніше значення функції, яке вона повертає.
    Покажу на прикладі:

    main ()
    printf ( "Функція 1 (25-18) ==.". FuncOne ()); // В результаті отримаємо 7
    printf ( "Функція 2 (20 + 5) ==.". FuncTwo ()); // У другій функції у нас вийде 25
    printf ( "Функція 3 (20) ==.". FuncThree ()); // Третя функція поверне значення 20
    >
    stock FuncOne ()
    return FuncTwo () - 18;
    >
    stock FuncTwo ()
    return 5 + FuncThree ();
    >
    stock FuncThree ()
    return 20; // Третя функція поверне 20
    >

    У попередньому пункті ми говорили про реакцію стандартних колбеков на певні значення і при поверненні функції треба враховувати яке значення ця функція повертає.
    Навіть стандартні функції повертають певні значення. Чому рівні ці значення - можна дізнатися на сайті wiki.sa-mp.com. пошукавши потрібну Вам функцію і подивившись її опис.

    Урок оператор повернення (return)

    На цьому все =)
    Якщо є які-небудь питання, якщо щось незрозуміло пояснено або є будь-які доповнення / виправлення для даного уроку, прошу написати про це нижче.
    Всім постараюся допомогти, все думки прийму до відома.

    Версія уроку не остаточна і з часом можливі доповнення / виправлення.
    З вами був DeimoS. Дякуємо за увагу

    Зв'язатися зі мною можна в особистих повідомленнях цієї групи

    Широко відомо, що ідеї стоять 0.8333 цента кожна (виходячи з ринкової ціни 10 центів за дюжину).
    Великих ідей повно, на них немає попиту.
    Втілення ідеї в закінчену гру вимагає довгої роботи,
    таланту, терпіння і креативності, не кажучи вже про витрати грошей, часу і ресурсів.
    Запропонувати ідею просто, втілити - ось в чому проблема

    S teve P avlina

    Писалося все за один присід і різні частини уроку в різному порядку, тому десь може бути несостиковочка або марення У самого вже погляд "замилилося" і все, що побачив, переправив. Якщо знайдете недоліки - пишіть, не соромтеся: 3
    У планах зробити опис кожного з операторів в подібній формі, тільки більш структуровано

    Зв'язатися зі мною можна в особистих повідомленнях цієї групи

    Широко відомо, що ідеї стоять 0.8333 цента кожна (виходячи з ринкової ціни 10 центів за дюжину).
    Великих ідей повно, на них немає попиту.
    Втілення ідеї в закінчену гру вимагає довгої роботи,
    таланту, терпіння і креативності, не кажучи вже про витрати грошей, часу і ресурсів.
    Запропонувати ідею просто, втілити - ось в чому проблема

    S teve P avlina