Italian parametro optional nella dichiarazione di una sub

insoft

Member
Licensed User
Longtime User
Buongiorno a tutti utilizzo la versione 13 di b4a.
Ho cercato sul forum anche discussioni abbastanza recenti (2023) per sapere se è stato implementata l'istruzione "optional" nella dichiarazione di una sub che veniva promessa come implementazione futura sin dal 2015 ma sinceramente non ho capito se al momento esiste.

Sta di fatto che un istruzione come "Public Sub ShowErrorMessage(msg As String, optional byval title As String = "Errore" mi risponde "Manca la dichiarazione del tipo di variabile, verrà usato il tipo string".

Sbaglio qualcosa io o il parametro optional ancora non esiste.

Grazie a tutti.
Massimo
 

Star-Dust

Expert
Licensed User
Longtime User
Buongiorno,

Non esiste optional.

La regola è questa, tutte le variabili di tipo primitivo (int, float, double, chat) sono trasferiti per valore (inclusa la stringa anche se non è primitiva) tutto il resto (classi, liste, mappe, tipo personalizzati, ecc..) per riferimento.

Quindi se devi trasferire per riferimento una variabile di tipo primitivo devi metterla dentro una complessa (ad esempio Mappa)
 

insoft

Member
Licensed User
Longtime User
Buongiorno,

Non esiste. Tutte le variabili di tipo primitivo (int, float, double, chat) sono trasferiti per valore (inclusa la stringa anche se non è primitiva) tutto il resto (classi, liste, mappe, tipo personalizzati, ecc..) per riferimento
Grazie
 

LucaMs

Expert
Licensed User
Longtime User
Magari sbaglio, ma non credo che la domanda riguardasse il passaggio di parametri per valore o per riferimento (benché importante) ma proprio il poter creare una routine con parametri opzionali, cosa che, come ha detto @Star-Dust, in B4X non è possibile.

Il "workaround" (oh, in questo momento non mi viene il termine italiano 😁 :confused: ) è, in questo caso, passare una stringa vuota (in altri Null) e controllarne subito il contenuto:
B4X:
'''Public Sub ShowErrorMessage(msg As String, optional byval title As String = "Errore")
Public Sub ShowErrorMessage(msg As String, title As String)
    If title.Length = 0 Then title = "Errore"
'...
End Sub


[Un altro problema (già che ci sono!) è il numero di parametri. Nei casi in cui si dovesse chiamare la routine in modo indiretto, usando CallSub o CallSubDelayed, ci sono le versioni 3 di questi comandi, ovvero CallSub3 e CallSubDelayed3, tramite le quali puoi passare solo 2 parametri].
 

insoft

Member
Licensed User
Longtime User
Si in effetti riguardava la presenza dell'optional" come in tanti altri linguaggi.
Avevo comunque capito che non esiste, prova a mettere in pratica il tuo esempio.
Ancora grazie.
 
Top