API Basic Sub uk - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Sub / Call / Exit Sub / End Sub

ClassicUO • Basic

Sub об’єднує інструкції в іменовану процедуру для обробки предметів, перевірок або завершення операції. Допоміжна процедура виконується послідовно в поточному скрипті; її виклик не запускає окремий фоновий скрипт.

Точний синтаксис

Sub name(parameters)
    statements
End Sub
name(arguments)
Call name(arguments)
Call name arguments
Call name
Exit Sub
Return
Return expression

Параметри

  • name — Ім’я без урахування регістру. Власні процедури викликають без UO.; член модуля — Tools.Work(...). Public/Private керують доступом у модулях: див. Basic.Module та Basic.Visibility.
  • parameters / arguments — Параметри оголошують у дужках, аргументи передають за порядком. Типово діє ByRef; ByVal копіює значення, Optional задає значення пропущеного аргументу, останній ParamArray збирає решту. Правила типів, масивів, спільних посилань і зворотного запису наведені у п’яти розділах про параметри.
  • statements / End Sub — Тіло може бути порожнім; закривається End Sub. Локальні змінні належать окремому виклику, зокрема при рекурсії. Оголошуйте процедури на рівні файла або модуля, не всередині іншої процедури.
  • Call — У name(arguments) слово Call необов’язкове. Call name arguments дозволяє аргументи без дужок; Call name викликає процедуру без параметрів. Call відкидає повернуте значення. Вирази аргументів мають звичайний зміст; власні виклики не отримують UO.
  • Exit Sub / Return — Exit Sub або Return без виразу завершує поточний виклик. Return expression усередині Sub — розширення сумісності Basic; звичайний VB.NET Sub такої форми не має. Exit Function усередині Sub спричиняє помилку завантаження.

Повертає

End Sub, Exit Sub і порожній Return дають Unit: відсутність змістовного результату, а не ознаку успіху чи ID. Return expression у старому Basic Sub повертає вираз. ByRef окремо може змінити змінну викликача. Для помічника, що повертає значення, краще Function.

Поведінка

  • Підготовка нормалізує сумісні заголовки та Call, перевіряє блок і визначає імена викликів. Аргументи обчислюються й прив’язуються перед входом. Повторні виклики використовують готові інструкції, але окремі локальні значення.
  • Інтерпретатор створює область виклику, виконує тіло і повертається до наступної інструкції. Звичайний вихід та Exit Sub виконують блоки Finally, які залишають, після чого завершується зворотний запис параметрів. Винятки надходять до чинного обробника; помилковий виклик не означає успіх.
  • Перевірки паузи й зупинки залишаються в рушії. Помічник не створює потоку, затримки або таймауту. Рекурсія потребує умови завершення. Присвоєння результату імені Sub не підтримується: для name=expression потрібна Function.
  • Вкладені виклики процедур обмежено 32 кадрами, включно зі зворотними викликами та обробниками подій. Перевищення дає перехоплювану помилку скрипту; для глибокої обробки використовуйте цикл. Повернення або помилка звільняють кадр і дозволяють наступні виклики.

Приклади

1. Три форми виклику

# total починається з 4. AddAmount отримує total через ByRef; пропущений amount дорівнює 1, явні 3 та 2 передаються ByVal. Call із дужками, без дужок і звичайний виклик виконують одного помічника. Виходить 4+1+3+2=10; Main явно повертає 10.
Option Explicit On
Sub AddAmount(ByRef total, Optional ByVal amount=1)
    total += amount
End Sub

Sub Main()
    Dim total=4
    Call AddAmount(total)
    Call AddAmount total, 3
    AddAmount(total, 2)
    Return total
End Sub

Пояснення параметрів і виконання:

total починається з 4. AddAmount отримує total через ByRef; пропущений amount дорівнює 1, явні 3 та 2 передаються ByVal. Call із дужками, без дужок і звичайний виклик виконують одного помічника. Виходить 4+1+3+2=10; Main явно повертає 10.

2. Відкрита процедура та внутрішній помічник

# Batches.SumInto отримує total через ByRef і збирає 3,-9,4 у values. For Each викликає приватну AppendAmount. Перевірка від’ємного числа виходить лише з помічника: -9 пропускається, цикл триває. Від початкового 2 виходить 2+3+4=9. Помічник доступний у Batches, зовнішній виклик використовує відкрите ім’я модуля.
Option Explicit On
Module Batches
    Private Sub AppendAmount(ByRef total, ByVal value)
        If value < 0 Then
            Exit Sub
        End If
        total += value
    End Sub

    Public Sub SumInto(ByRef total, ParamArray values)
        For Each value In values
            AppendAmount(total, value)
        Next
    End Sub
End Module

Sub Main()
    Dim total=2
    Batches.SumInto(total, 3, -9, 4)
    Return total
End Sub

Пояснення параметрів і виконання:

Batches.SumInto отримує total через ByRef і збирає 3,-9,4 у values. For Each викликає приватну AppendAmount. Перевірка від’ємного числа виходить лише з помічника: -9 пропускається, цикл триває. Від початкового 2 виходить 2+3+4=9. Помічник доступний у Batches, зовнішній виклик використовує відкрите ім’я модуля.

3. Достроковий вихід і завершення

# Finish задає trace=1 та виходить; trace=99 пропускається. Finally дописує 2, тому ByRef повертає в Main trace=12. LegacyValue показує розширення Basic: Return 7 усередині Sub. Main отримує 12*10+7=127. trace — значення прикладу, не ігровий код.
Option Explicit On
Sub Finish(ByRef trace)
    Try
        trace=1
        Exit Sub
        trace=99
    Finally
        trace=trace*10+2
    End Try
End Sub

Sub LegacyValue()
    Return 7
End Sub

Sub Main()
    Dim trace=0
    Call Finish(trace)
    Return trace*10+LegacyValue()
End Sub

Пояснення параметрів і виконання:

Finish задає trace=1 та виходить; trace=99 пропускається. Finally дописує 2, тому ByRef повертає в Main trace=12. LegacyValue показує розширення Basic: Return 7 усередині Sub. Main отримує 12*10+7=127. trace — значення прикладу, не ігровий код.


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic