Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [AS2] Parametri opzionali

    E' possibile, in un metodo di una classe AS o anche una funzione, definire dei parametri opzionali, ovvero che possono essere messi oppure no?
    In php è possibile, mettendogli un valore di default, ho provato anche in AS ma non funge, c'è un metodo per farlo? Oppure semplicemente non si può fare e basta?

  2. #2
    ...ovvero vorresti fare in modo che se la funzione venisse chiamata senza definire i parametri che si aspetta possano essere questi definiti con dei valori di default??
    ...minchia due righe senza punteggiatura!! Rispondimi appena riprendi fiato!!

    ...ma con un if iniziale alla funzione che valuti questo non può andare bene?

  3. #3
    Originariamente inviato da harpox
    ...ovvero vorresti fare in modo che se la funzione venisse chiamata senza definire i parametri che si aspetta possano essere questi definiti con dei valori di default??
    ...minchia due righe senza punteggiatura!! Rispondimi appena riprendi fiato!!

    ...ma con un if iniziale alla funzione che valuti questo non può andare bene?
    E' un metodo che in base ad una stringa ed ad altri parametri, appunto opzionali, esegue altri metodi della classe.
    Per ora ho risolto semplicemente mettendo tutti i parametri nel metodo e quando lo richiamo metto solo quelli che mi servono, però non mi sembra una cosa molto corretta dal punto di vista di programmazione, ma magari mi sbaglio..

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    in AS ancora non c'è un modo di rendere dei parametri come opzionali

    il metodo più semplice è quello di verificare l'esistenza di un parametro, ad esempio

    codice:
    class Prova {
    	var __string:String;
    	function Prova(stringa:Object){
    		__string = (stringa != undefined) ? stringa : "" ;
    	}
    }
    con la sintassi abbreviata dell'if è più semplice da gestire perchè sta su una sola riga

    il limite principale di questo sistema è il fatto che se ometti un determinato valore che magari sta in mezzo ai parametri nel richiamo della classe, il valore successivo assumerebbe il "posto" di quel parametro, quindi devi omettere tutti gli altri parametri affinchè questo risulti vuoto, in caso di un solo parametro da omettere invece, basta metterlo alla fine degli altri parametri

    ovviamente dipende anche da come stai lavorando e da quale è il tuo scopo, ad esempio per dare dei valori ad un movieclip io utilizzo un object che contiene al suo interno i valori di _x _y _alpha ecc... lo metto come ultimo parametro e poi faccio

    if(initObject != undefined){
    target._x = (initObject._x != undefined) ? initObject._x : 0;
    target._y = (initObject._y != undefined) ? initObject._y : 0;
    target._alpha = (initObject._alpha != undefined) ? initObject._alpha : 100;
    }

    purtroppo non ci sono altri modi

  5. #5
    Originariamente inviato da and80
    in AS ancora non c'è un modo di rendere dei parametri come opzionali

    il metodo più semplice è quello di verificare l'esistenza di un parametro, ad esempio

    codice:
    class Prova {
    	var __string:String;
    	function Prova(stringa:Object){
    		__string = (stringa != undefined) ? stringa : "" ;
    	}
    }
    con la sintassi abbreviata dell'if è più semplice da gestire perchè sta su una sola riga

    il limite principale di questo sistema è il fatto che se ometti un determinato valore che magari sta in mezzo ai parametri nel richiamo della classe, il valore successivo assumerebbe il "posto" di quel parametro, quindi devi omettere tutti gli altri parametri affinchè questo risulti vuoto, in caso di un solo parametro da omettere invece, basta metterlo alla fine degli altri parametri

    ovviamente dipende anche da come stai lavorando e da quale è il tuo scopo, ad esempio per dare dei valori ad un movieclip io utilizzo un object che contiene al suo interno i valori di _x _y _alpha ecc... lo metto come ultimo parametro e poi faccio

    if(initObject != undefined){
    target._x = (initObject._x != undefined) ? initObject._x : 0;
    target._y = (initObject._y != undefined) ? initObject._y : 0;
    target._alpha = (initObject._alpha != undefined) ? initObject._alpha : 100;
    }

    purtroppo non ci sono altri modi
    Ho capito, non c'è modo...
    Vabbè in attesa che mettano qualcosa di simile al php (o altri linguaggi), continuo a fare come ho fatto fin'ora

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    oops, c'è un piccolo errore nel codice di esempio della classe

    codice:
    class Prova {
    	var __string:String;
    	function Prova(stringa:String){
    		__string = (stringa != undefined) ? stringa : "" ;
    	}
    }
    non sia mai che qualcuno la provi e crei problemi

  7. #7
    Originariamente inviato da and80
    in AS ancora non c'è un modo di rendere dei parametri come opzionali
    e visto l'andazzo mai ci sarà ... più facile che AS3.0 implementi finalmente l'overload di metodi.

    Come funziona l'overload ?

    Visto che avete tirato in ballo il php, che non supporta nemmeno lui overload, vediamo l'esempio in php:
    codice:
    class Test {
    	function scriviQUalcosa($testo = "qualcosa") {
    		echo $testo;
    	}
    }
    Questa semplice classe con il suo semplice metodo fanno un'operazione banale per che conosce il php (o il python) ma di fatto è un modo diverso di utilizzare un overload.

    Java e .NET parlando, nonchè probabilmente AS3.0, è come se avessimo fatto una cosa tipo questa (rappresentata in AS2.0)
    codice:
    class Test {
    	public function scriviQUalcosa(Void):Void {
    		trace("qualcosa");
    	}
    	public function scriviQUalcosa(testo:String):Void {
    		trace(testo);
    	}
    }
    il metodo scriviQualcosa viene definito più di una volta (overload del metodo) e serve ad indicare quale versione dei due usare qualora il parametro sia stato inviato come stringa oppure no.

    La naturale conseguenza delle possibilità di overload è questa
    codice:
    class Test {
    	public function scriviQUalcosa(Void):Void {
    		trace("qualcosa");
    	}
    	public function scriviQUalcosa(testo:String):Void {
    		trace(testo);
    	}
    	public function scriviQUalcosa(quanteVolte:Number, testo:String):Void {
    		for(var i:Number = 0; i < quanteVolte; i++)
    			trace(testo);
    	}
    	public function scriviQUalcosa(testo:String, uppercase:Boolean):Void {
    		if(uppercase)
    			testo = testo.toUpperCase();
    		trace(testo);
    	}
    }
    Ovvero a seconda di come verrà richiamato il metodo avremo risultati differenti.
    codice:
    var test = new Test;
    test.scriviQUalcosa(); 			// qualcosa
    test.scriviQUalcosa("ciao"); 		// ciao
    test.scriviQUalcosa(2, "ciao");		// ciao ciao
    test.scriviQUalcosa("ciao", true);	// CIAO
    test.scriviQUalcosa("ciao", false);	// ciao

    Come faccio in AS1.0 (quindi anche in AS2.0) a fare qualcosa di simile ? Sfruttando arguments
    codice:
    function overLoad() {
    	trace(arguments.length);
    }
    
    overLoad();
    overLoad("test");
    overLoad(1, true);
    overLoad("a", ["b", "c"], d);
    Ovvero a seconda del tipo di parametri inviati e del totale di essi è possibile comportarsi in modo differente.
    Qualcosa tipo questo:
    codice:
    class Test {
    	public function scriviQUalcosa(Void):Void {
    		var	i:Number = arguments.length;
    		if(i === 0)
    			trace("qualcosa");
    		else {
    			if(i === 1)
    				trace(arguments[0]);
    			else if(i === 2) {
    				if(typeof(arguments[0]) === "number") {
    					for(i = 0; i < arguments[0]; i++)
    						trace(arguments[1]);
    				}
    				else if(typeof(arguments[1]) === "boolean") {
    					if(arguments[1])
    						arguments[0] = arguments[0].toUpperCase();
    					trace(arguments[0]);
    				}
    			}
    		}
    	}
    }
    che seppur orribile è la "brutta copia" della versione col metodo ed i suoi 4 overloads vista più sopra




    [edit]
    tecnicamente parlando anche il php ha una funzione per lavorare "in arguments" ... per l'appunto
    codice:
    func_get_args(); 	=> 	arguments
    func_num_args(); 	=> 	arguments.length
    func_get_arg($i); 	=> 	arguments[i]
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Infatti avevo provato a usare l'overload, sicuro che in AS 2.0, però poi mi ha restituito un bell'errore dicendomi che non era supportato l'overload

    Non sapevo che arguments fosse presente in AS 1.0 e 2.0

    In php5 non c'è l'overload? Mi sembrava di sì :master:

    Cmq concordo che l'overload sia la soluzione migliore

  9. #9
    Originariamente inviato da darkmavis
    Non sapevo che arguments fosse presente in AS 1.0 e 2.0
    AS è praticamente JavaScript, il 2 è una pessima implementazione di ECMA 4 compatibile ECMA 3


    Originariamente inviato da darkmavis
    In php5 non c'è l'overload? Mi sembrava di sì :master:
    ti sembra male ... e ad essere sincero non so nemmeno se ci sarà nel PHP 6 visto che tutti si sono abituati a scrivere i "defaults" in dichiarazione metodo / funzione


    Originariamente inviato da darkmavis
    Cmq concordo che l'overload sia la soluzione migliore
    il problema è che in AS2 non hai alternative, visto che l'assegnazione di default non è fattibile.

    In compenso l'overLoad è una caratteristica molto "strict type", i pythoniani credo preferiscano come è per il php .

    Se invece vuoi mandare a casaccio qualunque cosa a una funzione c'è qualcosa che non va nella funzione stessa, usane più di una e pace


    P.S. in PHP5 i metodi per simulare overload (__call) sfruttano, per l'appunto, arguments
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #10
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    ottima sintesi, approfondirò "arguments"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.