Buone notizie, a tutti. Tutti quelli che lavorano con array e vettori - così, tutti gli sviluppatori - godranno delle nuove opportunità: dalla versione di Flash di fine agosto 2011, Realaxy ActionScript Editor (RASE) supporta il nuovo collezioni Estensione della lingua AS3. In questo post ti mostreremo cosa può fare.
Una collezione è un termine generico che significa, approssimativamente, "un gruppo di oggetti tipati in modo simile che sono raggruppati insieme". La creazione di una raccolta in ActionScript 3.0 può essere eseguita utilizzando matrici, vettori, dizionari o oggetti; Ognuno di loro ha alcuni degli ingredienti di un concetto perfetto. Tuttavia, se hai anche una conoscenza di base di qualsiasi linguaggio moderno e di tendenza come Scala, Groovy o Ruby, sentirai sicuramente la mancanza di un approccio funzionale nel puro modo AS3 di elaborare le Collezioni.
Bene, introduciamo il collezioni Estensione della lingua AS3 disponibile in RASE Beta 10, build 8177+.
Un vocabolario completo di metodi integrati con esempi è disponibile qui: uno per gli elenchi e un altro per le mappe (queste sono immagini; scorrile verso il basso, sono davvero ENORME).
Per non perdersi in questa giungla, diamo un'occhiata ad alcuni semplici casi d'uso. Il primo esempio di vita reale dimostra la concisione del codice di raccolta:
Creiamo a elenco
, che può contenere solo int
valori.
dove
?).selezionare
?).selezionare
?).elenco
e traccia il risultato.Dove
, selezionare
, SelectMany
- queste operazioni sono facili da usare quando si crea una query.
Operazioni come tutti
, qualunque
, containsAll
, e contiene
funziona perfettamente in frasi condizionali (?Se
? dichiarazioni, ecc.).
Per modificare un elenco, abbiamo una vasta gamma di armi: rimuovere
, Rimuovi tutto
, removeWhere
, removeHead
, removeTail
, eccetera.
Per quelle persone che hanno sicuramente un occhio perversione abbiamo preparato un sacco di operazioni come foldLeft
/foldRight
, reduceLeft
/reduceRight
, intersecare
, eccetera.
Detto semplicemente, ci sono un sacco di operazioni adatte a ogni fantasia e quasi ogni compito. In alcune operazioni si trasmettono solo uno o più valori, in alcuni altri si aggiunge una chiusura.
Il linguaggio di raccolta è volutamente semplice. Supporta due tipi: Elenco
e Carta geografica
. Carta geografica
è abbastanza simile a un banale Dizionario
che contiene alcuni metodi utili - chiavi
, valori
, containsKey
, containsValue
(utile per controlli e condizioni), pushMap
(per unire i valori), removeKey
, removeValue
, eccetera.
Le mappe sono intelligenti e sicure. Non ti permetteranno di aggiungere una chiave o un valore errati:
Le mappe funzionano bene con qualsiasi elenco e query.
Esistono anche operazioni di conversione che possono essere utilizzate per facilitare l'incorporamento delle nuove estensioni Collections al tuo progetto Pure-ActionScript reale. Basta prendere un array banale (o vettoriale) e applicare il .elencare
operazione. Dopo aver elaborato una lista (o una mappa) puoi sempre convertirla in stile AS3 vecchia scuola usando .toArray
o .toVector
.
Per dimostrare come iniziare con queste raccolte, ecco una guida passo passo basata su una situazione banale. Supponiamo che il tuo compito sia quello di creare un elenco di "utenti consigliati" per un account Twitter. Dobbiamo elaborare una raccolta molto lunga di centinaia o migliaia di oggetti, per recuperare un breve elenco (che corrisponde a una serie di criteri) e applicare alcune operazioni su ogni elemento in quella breve lista.
Non rivolgeremo la nostra attenzione all'interazione con le API di Twitter, dal momento che il nostro obiettivo è solo quello di mostrare come iniziare con collezioni linguaggio e mostrare i vantaggi di un approccio funzionale nel lavorare con le raccolte in AS3.
Crea un nuovo progetto da zero e chiamalo Collezioni. Se questa è la tua prima esperienza con l'editor, ti consigliamo di leggere il tutorial TutorialRealaxy HelloWord e / oRealaxy Overview For Beginners.
Ora abbiamo bisogno di creare tre classi per memorizzare la struttura dei dati: Utente
,яTwitterAccount
e Messaggio
. Possiamo farlo dal creare
menu, che è disponibile facendo clic con il tasto destro del mouse sul codice o premendo Ctrl + N.
Digita il nome della classe in una finestra pop-up.
Vai a the<
яposition e hitяaccedere
.
Aggiungi i seguenti campi: nome utente
, cognome
e id
. Il codice sarà simile a questo:
Invoca il Ctrl + N di nuovo il menu.
Apparirà una nuova finestra pop-up. Seleziona tutti i campi appena creati e premi ok.
.accordare()
MetodoNon dimenticare di aggiungere una presentazione di testo al Utente
classe. Inserisci .accordare()
metodo - oggetto 5 da theяCtrl-N menu (come nello screenshot dei passaggi 2 e 6).
Il Utente
la lezione è pronta. Il suo codice sarà simile a questo:
Usando lo stesso procedimento dei passaggi 2-9 devi creareTwitterAccount
яandяMessaggio
classi.
я
NB: per evitare un errore di tipo (come quello mostrato nell'immagine sopra), è necessario importare il file collezioni
lingua da theяCtrl + L menu:
NB2: яThe TwitterAccount
e Messaggio
le classi ç dovrebbero essere reticolate. Affinché questo accada, dopo aver importato il file collezioni
linguaggio, devi creare il Messaggio
classe, tornare indietro al TwitterAccount
classificare e completare la riga che ha causato un errore.
NB3: non dimenticare di aggiungere getter, setter e a .accordare()
metodo.
Ora è il momento di scrivere del codice Principale()
. Per prima cosa, dobbiamo aggiungere alcuni campi
NB: Usa la scorciatoia da tastiera completa SmartSmart (Ctrl-Shift-Spazio) per risparmiare un po 'di tempo durante la digitazione di queste frasi:
Poiché il nostro tutorial è solo una demo che mostra come lavorare con le raccolte in AS3, salteremo la parte che rimanda a come ottenere questi dati dall'API di Twitter.
Immaginiamo di avere già:
seguaci
,яfollowedBefore
,candidatesLongList
,candidatesShortList
, che is.empty al momento.La terza raccolta può essere estremamente ampia e contenere centinaia o addirittura migliaia di elementi. Il nostro obiettivo è quello di applicare una domanda sofisticata e quindi tagliare gli articoli inutili secondo il principio di Buonarroti? Ho visto l'angelo nel marmo e scolpito fino a quando non l'ho liberato.?
Salta a Principale()
costruttore, ed entra in thecandidatesLongList
con il suo metodo ?dove
? (colpire Ctrl-Spazio utilizzare il completamento automatico come nello screenshot qui sotto):
Apparirà la seguente frase:
Non essere sorpreso, è solo un Chiusura
, e "esso
"è solo il suo parametro.
Una chiusura è, infatti, la stessa funzione anonima, ma con una serie di piccole differenze.
Prima il Chiusura
ha una sintassi molto concisa. I parametri non hanno una dichiarazione di tipo (per essere più precisi, ce l'hanno, ma tali dichiarazioni sono nascoste). La chiusura ha un comportamento speciale -? L'ultima affermazione è un valore di ritorno & rdquo - il che significa che dovresti usare ?1;
? (nell'ultima riga) anziché ?ritorno 1;
?
In secondo luogo, ha una vista speciale per le chiusure a linea singola - in tale chiusura viene omesso un punto e virgola alla fine (per due motivi: leggibilità e brevità).
A differenza di una funzione anonima (e anche come contropartita di quanto sopra Array
e Vettori
), una chiusura è digita sicuro. Ciò significa che il completamento automatico e il controllo dei tipi funzioneranno nelle chiusure.
Per concludere, a Chiusura
è una sorta di funzione sugli steroidi. Ha molte caratteristiche gustose che ci aiutano a scrivere tutto in modo rapido e conciso.
Torniamo alla nostra chiusura incompiuta. Aggiungi del codice che implementerà le nostre "regole". Questo codice restituirà una versione ridotta di candidatesLongList
che non include nessuno dei nostri follower:
Quindi aggiungi un altro criterio:
Teoricamente, il collezioni il linguaggio consente di annidare una a una a molte condizioni diverse. Aggiungiamo un altro criterio (includi utenti che hanno? Flash ?,? ActionScript? O? Adobe? Nel loro campo Biografia) usando un'espressione regolare:
Seleziona l'intera query e premi Ctrl-Alt-V. Verrà introdotta una nuova variabile.
Ora siamo in grado di fare tutto ciò che vogliamo:
Dovremmo quindi copiare il contenuto di risultato
in candidatesShortList
.
Costruisci un modulo con Ctrl-F9 e dai un'occhiata al Produzione finestra. Il codice generato puro AS3 di Principale()
sarà simile a questo:
pacchetto com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; import flash.display.Sprite; public class Main estende Sprite private var followers: Array = new Array (); private var followsBefore: Array = new Array (); private var candidateLongList: Array = new Array (); private var candidateShortList: Array = new Array (); funzione pubblica Main () // esclude i nostri follower e utenti seguiti da noi prima // includi persone con "Flash", "ActionScript" e "Adobe" nella loro biografia // aggiungili tutti alla lista di suggerimenti consigliati this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (listsLongList, function (n: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (followers, funzione (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, this, false) &&! CollectionsLanguageUtil.any (followsBefore, function (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, this, false);, this, false), function (it: TwitterAccount, stops: Object): Boolean return /Flash|ActionScript|Adobe/.test(it.bio);, this, false); var names: Array = CollectionsLanguageUtil.select (candidateShortList, function (it: TwitterAccount, stops: Object): String return it.user.username + "," + it.user.surname;, this, false); CollectionsLanguageUtil.forEach (nomi, funzione (m: String, stops: Object): void // TODO: fa qualcosa con 'm', this, false);
Sembra un po 'illeggibile, eh? Soprattutto confrontando con il nostro codice DSL:
La nuova estensione del linguaggio Collections ti consente di: