Mi piacerebbe passare un primitivo (int, bool, ...) per riferimento. Ho trovato una discussione a riguardo (paragrafo "Passare i tipi di valore per riferimento") qui: value types in Dart, ma mi chiedo ancora se ci sia un modo per farlo in Dart (tranne l'utilizzo di un object wrapper)? Qualche sviluppo?C'è un modo per passare un parametro primitivo per riferimento in Dart?
risposta
Il linguaggio Dart non supporta questo e dubito che lo sarà mai, ma il futuro lo dirà.
Primitives saranno passati per valore, e come già detto qui, l'unico modo per 'passare primitive per riferimento' è avvolgendo come loro:
class PrimitiveWrapper {
var value;
PrimitiveWrapper(this.value);
}
void alter(PrimitiveWrapper data) {
data.value++;
}
main() {
var data = new PrimitiveWrapper(5);
print(data.value); // 5
alter(data);
print(data.value); // 6
}
Se non si vuole fare questo, allora hai bisogno di trovare un altro modo per aggirare il tuo problema.
un caso in cui vedo le persone che hanno bisogno di passare per riferimento è che hanno una sorta di valore che vogliono passare a funzioni in una classe:
class Foo {
void doFoo() {
var i = 0;
...
doBar(i); // We want to alter i in doBar().
...
i++;
}
void doBar(i) {
i++;
}
}
In questo caso si può solo fare i
una classe membro invece.
Il wrapper non è generico ma il linguaggio consente questo miglioramento. – mezoni
Se siete dei generici, andate sicuramente. Credo che questo sia il modo più semplice per spiegare il punto. :) –
La tua risposta - Il linguaggio Dart non supporta questo e dubito che lo sarà mai. Qual è il problema? È possibile implementare questa funzionalità in Dart e in Dart2JS. Molte funzionalità proposte possono essere implementate e strutturate per una compilazione efficace in Javascript. Il problema è che il team Dart si è concentrato sui bug di correzione e sui miglioramenti del client web. Penso che questo sarebbe implementato in futuro. Non ho trovato problemi che impediscano questo. Penso che il tuo lavoro sia lontano dal design del compilatore? Ho ragione? – mezoni
No, i wrapper sono l'unico modo.
Sono passati per riferimento. Non ha importanza perché i tipi "primitivi" non hanno metodi per modificare il loro valore interno.
Correggimi se sbaglio, ma forse stai fraintendendo cosa significa "passare per riferimento"? Presumo che tu voglia fare qualcosa come param1 = 10
e vuoi che questo valore sia ancora 10
quando torni dal tuo metodo. Ma i riferimenti non sono puntatori. Quando si assegna al parametro un nuovo valore (con = operatore), questa modifica non si rifletterà nel metodo di chiamata. Questo è ancora vero con i tipi non primitivi (classi).
Esempio:
class Test {
int val;
Test(this.val);
}
void main() {
Test t = new Test(1);
fn1(t);
print(t.val); // 2
fn2(t);
print(t.val); // still 2, because "t" has been assigned a new instance in fn2()
}
void fn1(Test t) {
print(t.val); // 1
t.val = 2;
}
void fn2(Test t) {
t = new Test(10);
print(t.val); // 10
}
EDIT ho cercato di fare la mia risposta più chiaro, sulla base dei commenti, ma in qualche modo io non riesco a farlo bene frase senza causare più confusione. Fondamentalmente, quando qualcuno che viene da Java dice "i parametri sono passati per riferimento", significano che cosa uno sviluppatore C/C++ vorrebbe dire dicendo "i parametri vengono passati come puntatori".
@mezoni: la tua definizione non è esattamente ciò che significa "passare per riferimento"? Se i parametri fossero passati per valore, nel mio esempio fn1() non funzionerebbe come dovrebbe, vero? – MarioP
Beh, il mio punto era che non ci sono veri tipi primitivi in Dart. num, int, double, bool - sono tutti oggetti e si comportano come classi "complesse" quando vengono passati come parametri. Inoltre, penso che entrambi intendiamo la stessa cosa, solo nominandola in modo diverso. Con "passa per riferimento" intendo il riferimento all'oggetto viene passato in giro e le modifiche dei membri dell'oggetto rimangono dopo il ritorno della funzione. Siamo sulla stessa pagina ora? :) – MarioP
Se qualcuno ha qualche idea su come renderlo più chiaro nella mia risposta, sentitevi liberi di modificarlo, perché onestamente non ho idea di come dovrei esprimerlo. : -/ – MarioP
- 1. Passare un array per riferimento in C?
- 2. C'è un modo per passare un'annotazione Java come parametro?
- 3. In C# devo passare un parametro per valore e restituire la stessa variabile o passare per riferimento?
- 4. un parametro di metodo può passare un oggetto per riferimento ma deve essere di sola lettura?
- 5. Un modo curioso di passare un parametro ad un metodo
- 6. Java: il modo migliore per passare int per riferimento
- 7. C'è un modo per evitare di passare inavvertitamente un argomento non booleano ad un parametro booleano?
- 8. errore PHP: "non può passare il parametro 2 per riferimento"
- 9. Impossibile passare il parametro 2 per riferimento - uuid PDO
- 10. Come passare un parametro come riferimento con MethodInfo.Invoke
- 11. Motivo per passare un puntatore tramite riferimento in C++?
- 12. C'è un modo per passare un altro parametro nella funzione callback call_previs_previsione?
- 13. Un modo sicuro per passare un parametro data a una chiamata Ajax a un'azione MVC
- 14. Esiste un modo per passare un parametro personalizzato quando si effettua una chiamata con Twilio?
- 15. Come posso passare un int primitivo al mio AsyncTask?
- 16. C++ 0x: modo corretto per ricevere un lambda come parametro per riferimento
- 17. Come passare più valori per un singolo parametro URL?
- 18. Passare una stringa per riferimento in Javascript
- 19. Esiste un modo per passare l'operatore aritmetico e logico come parametro del metodo in VBA?
- 20. Passare un parametro a ICommand
- 21. Swagger/OpenAPI - usa $ ref per passare un parametro definito riutilizzabile
- 22. Qual è il modo corretto per fare riferimento a un parametro in Doxygen?
- 23. In F #, è possibile passare un riferimento a un valore predefinito mutabile come parametro?
- 24. Dart c'è un modo per misurare il tempo di esecuzione per un piccolo codice
- 25. Come passare un parametro opzionale in ActionResult
- 26. Passare un metodo come parametro
- 27. Passare un parametro all'host OWIN
- 28. Come passare la struttura per riferimento?
- 29. C'è un modo per aggirare un parametro di tipo inutilizzato?
- 30. C'è un modo per passare un argomento all'operatore is?
Sono curioso, qual è il tuo caso d'uso? Perchè vuoi fare questo? –
@ShailenTuli Tu equiparate tutto da solo? Qual è la differenza perché? Viviamo tutti una volta e tutte le persone sono diverse. E tutti abbiamo interessi diversi. Ci sono cose che usiamo molto raramente. Ma questo non significa che non ne abbiano bisogno. – mezoni
Mi dispiace, ma non capisco il commento. Sto semplicemente cercando di capire l'intento dell'interrogante. –