API Basic Callbacks it - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

AddressOf / callbacks

ClassicUO • Basic

AddressOf conserva un riferimento a una Sub o Function dello script senza chiamarla. Il riferimento può essere passato, restituito o conservato in una raccolta per scegliere una regola di elaborazione.

Sintassi esatta

Dim callback = AddressOf ProcedureName
Dim callback As Object = AddressOf Tools.FunctionName
callback(arguments)
callback.Invoke(arguments)
Process(values, AddressOf Predicate)

Parametri

  • ProcedureName — Nome di una procedura dichiarata, eventualmente qualificato con Module. Deve corrispondere a una sola dichiarazione. Nomi sconosciuti, membri Private non accessibili e overload sono respinti prima dell’esecuzione. Per funzioni native Basic o comandi UO scrivere una funzione intermedia con nome univoco. Nessuna parentesi dopo AddressOf nome.
  • callback / arguments — callback è un Object. callback(...) e callback.Invoke(...) chiamano in modo sincrono nel thread dello script. Gli argomenti nominati usano i veri nomi dei parametri. Assegnare prima un elemento di raccolta a una variabile. Il riferimento viene acquisito prima degli argomenti, anche se questi cambiano callback.
  • ByRef / ByVal / Optional / ParamArray — ByVal copia valore o riferimento; ByRef riscrive le modifiche; Optional calcola i valori omessi; ParamArray raccoglie valori posizionali. Gli argomenti nominati seguono quelli posizionali; i valori ParamArray richiedono chiamate solo posizionali. Nomi o numero errati falliscono prima degli effetti degli argomenti.

Restituisce

AddressOf restituisce un riferimento Object, non un ID, un indirizzo, un Boolean o il risultato della funzione. Function restituisce il proprio risultato; Sub senza espressione Return non restituisce valore (Unit). IsPositive restituisce 1/True o 0/False. Main restituisce String negli esempi 1 e 3 e Integer 15 nel secondo.

Comportamento

  • Il riferimento non cattura le variabili locali della funzione creatrice: non è una lambda o chiusura. Appartiene allo script caricato; un altro interprete o uno script ricaricato non può invocarlo. Una fabbrica Public può esporre deliberatamente il proprio aiutante Private.
  • La preparazione controlla nome e accesso. L’interprete conserva un riferimento immutabile per posizione AddressOf. Ogni chiamata legge la variabile attuale, controlla la firma, valuta una volta gli argomenti nell’ordine scritto ed entra in un normale contesto di procedura. ByRef ed eccezioni seguono le chiamate dirette.
  • Non crea thread o timer. Pausa e annullamento usano i normali punti di controllo, anche nei cicli del callback. Gli errori raggiungono Catch/Finally del chiamante; Catch non assorbe l’arresto d’emergenza. Le chiamate native bloccanti mantengono i propri limiti di annullamento.
  • Qui non sono supportati dichiarazioni Delegate, lambda, puntatori DLL o riferimenti a overload. AddressOf non usa UO.; i comandi di gioco nella funzione intermedia conservano UO.
  • Le chiamate annidate sono limitate a 32 frame, inclusi callback e gestori di eventi. Il superamento genera un errore intercettabile; usare cicli per elaborazioni profonde. Ritorno o errore liberano il frame per le chiamate successive.

Esempi

1. Filtrare con un predicato

# values è la List iniziale; predicate è AddressOf IsPositive. FilterValues chiama predicate(number) una volta per numero. Rimangono i positivi 4 e 7: selected.Count()=2 e selected[0]=4. Main restituisce "2:4". I due aiutanti sono codice completo dello script, non ulteriori comandi API.
Option Explicit On
Function IsPositive(ByVal number) As Boolean
    Return number > 0
End Function

Function FilterValues(ByVal values, ByVal predicate)
    Dim result = List()
    For Each number In values
        If predicate(number) Then
            result.Add(number)
        End If
    Next
    Return result
End Function

Sub Main()
    Dim numbers = List()
    numbers.Add(-2)
    numbers.Add(4)
    numbers.Add(7)
    Dim selected = FilterValues(numbers, AddressOf IsPositive)
    Return CStr(selected.Count()) & ":" & CStr(selected[0])
End Sub

Spiegazione dei parametri e dell’esecuzione:

values è la List iniziale; predicate è AddressOf IsPositive. FilterValues chiama predicate(number) una volta per numero. Rimangono i positivi 4 e 7: selected.Count()=2 e selected[0]=4. Main restituisce "2:4". I due aiutanti sono codice completo dello script, non ulteriori comandi API.

2. Modificare una variabile esterna

# AddAmount riceve total ByRef e amount ByVal, predefinito 1. update(total) cambia 10 in 11; Invoke con amount:=4 e total:=total associa i nomi e cambia 11 in 15. ByRef riscrive la variabile originale. Sub non restituisce nulla; Main restituisce Integer 15, non Boolean.
Option Explicit On
Sub AddAmount(ByRef total As Integer, Optional ByVal amount = 1)
    total += amount
End Sub

Sub Main()
    Dim update = AddressOf AddAmount
    Dim total = 10
    update(total)
    update.Invoke(amount:=4, total:=total)
    Return total
End Sub

Spiegazione dei parametri e dell’esecuzione:

AddAmount riceve total ByRef e amount ByVal, predefinito 1. update(total) cambia 10 in 11; Invoke con amount:=4 e total:=total associa i nomi e cambia 11 in 15. ByRef riscrive la variabile originale. Sub non restituisce nulla; Main restituisce Integer 15, non Boolean.

3. Regola privata ed errore

# Rules.Create restituisce un riferimento a Private CheckedDouble. AddressOf Rules.CheckedDouble diretto dall’esterno è vietato. operation(6) restituisce 12; operation(-1) solleva "negative" prima dell’assegnazione, lasciando result=12. Catch legge il messaggio e Finally aggiunge ":done". Main restituisce "12:negative:done". Chiudere l’IDE non ferma lo script.
Option Explicit On
Module Rules
    Private Function CheckedDouble(ByVal number) As Integer
        If number < 0 Then
            Throw "negative"
        End If
        Return number * 2
    End Function

    Public Function Create()
        Return AddressOf CheckedDouble
    End Function
End Module

Sub Main()
    Dim operation = Rules.Create()
    Dim result = operation(6)
    Dim message = ""
    Try
        result = operation(-1)
    Catch problem
        message = problem
    Finally
        message = message & ":done"
    End Try
    Return CStr(result) & ":" & message
End Sub

Spiegazione dei parametri e dell’esecuzione:

Rules.Create restituisce un riferimento a Private CheckedDouble. AddressOf Rules.CheckedDouble diretto dall’esterno è vietato. operation(6) restituisce 12; operation(-1) solleva "negative" prima dell’assegnazione, lasciando result=12. Catch legge il messaggio e Finally aggiunge ":done". Main restituisce "12:negative:done". Chiudere l’IDE non ferma lo script.


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

Basic