2013-08-15 11 views
10

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?

+0

Sono curioso, qual è il tuo caso d'uso? Perchè vuoi fare questo? –

+0

@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

+0

Mi dispiace, ma non capisco il commento. Sto semplicemente cercando di capire l'intento dell'interrogante. –

risposta

5

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.

+0

Il wrapper non è generico ma il linguaggio consente questo miglioramento. – mezoni

+0

Se siete dei generici, andate sicuramente. Credo che questo sia il modo più semplice per spiegare il punto. :) –

+0

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

3

No, i wrapper sono l'unico modo.

3

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".

+0

@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

+0

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

+0

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

Problemi correlati