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.
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)
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
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 ? ) è, 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].
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.