Veste bună, toată lumea. Toți cei care lucrează cu vectori și vectori - așa, toți dezvoltatorii - se vor bucura de noile oportunități: de la construirea Flash, Realaxy ActionScript Editor (RASE) de la sfârșitul lunii august 2011 sprijină noul Colecții Extensie de limbă AS3. În acest post vă vom arăta ce poate face.
O colecție este un termen general care înseamnă, aproximativ, o grămadă de obiecte asemănătoare tipizate care sunt grupate împreună. Construirea unei colecții în ActionScript 3.0 se poate realiza prin utilizarea unor array-uri, vectori, dicționare sau obiecte; fiecare dintre ele are unele dintre elementele unui concept perfect. Cu toate acestea, dacă aveți chiar o cunoaștere de bază cu orice limbaj modern și modern, cum ar fi Scala, Groovy sau Ruby, veți simți cu siguranță lipsa unei abordări funcționale în metoda AS3 pură de prelucrare a colecțiilor.
Ei bine, să introducem Colecții Extensia de limbă AS3, disponibilă în RASE Beta 10, construiește 8177+.
Un vocabular complet al metodelor completate cu eșantioane este disponibil aici: unul pentru liste și altul pentru hărți (acestea sunt imagini, derulați-le în jos, sunt cu adevărat uriașe).
Pentru a nu vă pierdeți în această junglă, să aruncăm o privire asupra unor cazuri de utilizare simple. Primul eșantion de viață reală demonstrează concisitatea codului de colectare:
Creăm a listă
, care poate conține numai int
valorile.
Unde
?).Selectați
?).Selectați
?).listă
și urmăriți rezultatul.Unde
, Selectați
, selectMany
- aceste operații sunt ușor de utilizat atunci când construiți o interogare.
Operații cum ar fi toate
, orice
, containsAll
, și conține
să lucreze perfect în fraze condiționate (?dacă
? declarații etc.).
Pentru a modifica o listă, avem o gamă largă de arme: elimina
, inlătură tot
, removeWhere
, removeHead
, removeTail
, etc.
Pentru acele persoane care au cu siguranță un ochi de perversiune am pregătit o grămadă de operații cum ar fi foldLeft
/foldRight
, reduceLeft
/reduceRight
, intersecta
, etc.
Pur și simplu a spus, există o mulțime de operațiuni potrivite pentru fiecare fantezie și aproape fiecare sarcină. În unele operațiuni pe care tocmai le transmiteți una sau mai multe valori, în alte câteva adăugați o închidere.
Limba de colectare este intenționat simplă. Suportă două tipuri: Listă
și Hartă
. Hartă
este destul de similar cu un trivial Dicţionar
care deține câteva metode utile - chei
, valorile
, containsKey
, containsValue
(util pentru verificări și condiții), pushMap
(pentru a îmbina valorile), removeKey
, removeValue
, etc.
Hărțile sunt inteligente și nu reușesc. Ele nu vă vor permite să adăugați o cheie sau o valoare incorectă:
Hărțile funcționează bine cu orice liste și interogări.
Există, de asemenea, operațiuni de conversie care pot fi utilizate pentru a facilita încorporarea noilor extensii de colecții în proiectul dvs real ActionScript. Doar luați o matrice trivială (sau vector) și aplicați .a lista
operațiune. După procesarea unei liste (sau a unei hărți), puteți oricând să o convertiți în stilul vechi AS3 folosind .toArray
sau .toVector
.
Pentru a demonstra cum să începeți cu aceste colecții, iată un ghid pas cu pas bazat pe o situație trivială. Să presupunem că sarcina dvs. este de a crea o listă de utilizatori sugerată pentru un cont Twitter. Trebuie să procesăm o colecție foarte lungă de sute sau mii de obiecte pentru a prelua o listă scurtă (care să corespundă unui număr de criterii) și pentru a aplica o anumită operație pe fiecare articol din lista scurtă.
Nu ne vom concentra atenția asupra interacțiunii cu API-ul Twitter, deoarece scopul nostru este doar să arătăm cum să începeți cu Colecții limbaj și să arate avantajele unei abordări funcționale în lucrul cu colecțiile din AS3.
Creați un nou proiect de la zero și numiți colecțiile. Dacă aceasta este prima ta experiență cu editorul, vă recomandăm să citiți Tutorialul Realaxy HelloWord Tutorial și / sauRelaxy Privire de ansamblu pentru începători.
Acum trebuie să creăm trei clase pentru a stoca structura de date: Utilizator
,яTwitterAccount
și Mesaj
. Putem face acest lucru de la Genera
care este disponibil prin clic dreapta pe cod sau prin apăsare Ctrl + N.
Introduceți numele clasei într-o fereastră pop-up.
Salt la ea<
născută și lovităintroduce
.
Adăugați următoarele câmpuri: nume de utilizator
, nume de familie
și id
. Codul va arăta astfel:
Invocați Ctrl + N din nou.
Va apărea o nouă fereastră pop-up. Selectați toate câmpurile nou create și apăsați O.K.
.toString ()
MetodăNu uitați să adăugați o prezentare de text la Utilizator
clasă. Adăuga .toString ()
metoda - punctul 5 din acesteaCtrl-N (la fel ca pe captura de ecran la Pasul 2 și 6).
Utilizator
clasa este gata. Codul său va arăta astfel:
Folosind același proces ca și pașii 2-9, trebuie să creațiTwitterAccount
яandяMesaj
clase.
я
NB: Pentru a evita o eroare de tip (ca cea prezentată în imaginea de mai sus), trebuie să importați Colecții
limba de la eaCtrl + L meniul:
NB2: яThe TwitterAccount
și Mesaj
clasamentele ar trebui să fie reticulate. Pentru ca acest lucru să se întâmple, după importul Colecții
limbă, trebuie să creați Mesaj
clasa, sari inapoi la TwitterAccount
și completați linia care a cauzat o eroare.
NB3: Nu uitați să adăugați getters, setters și a .toString ()
metodă.
Acum este momentul să scrieți niște coduri Principal()
. În primul rând, trebuie să adăugăm câteva câmpuri
NB: Utilizați comanda rapidă de la tastatură completă (Ctrl-Shift-Space) să vă petreceți puțin timp în timp ce tastați aceste fraze:
Deoarece tutorialul nostru este doar un demo care arată cum să lucrăm cu colecțiile din AS3, vom trece peste partea care se referă la modul de obținere a acestor date din API-ul Twitter.
Să ne imaginăm că deja avem:
adepți
,яfollowedBefore
,candidatesLongList
,candidatesShortList
, care este acum în acest moment.A treia colecție poate fi extrem de mare, care conține sute sau chiar mii de articole. Scopul nostru este să aplicăm o interogare sofisticată și astfel să tăiem articolele inutile în conformitate cu principiul lui Buonarotti? Am văzut îngerul din marmură și am sculptat până l-am eliberat.?
Sari la Principal()
constructorul și introduceți-lcandidatesLongList
cu metoda sa ?Unde
? (lovit Ctrl-Space pentru a utiliza completarea automată ca în ecranul de mai jos):
Va apărea următoarea expresie:
Nu fi surprins, este doar a Închidere
, și "aceasta
"este doar parametrul său.
O închidere este, de fapt, aceeași funcție anonimă, dar cu o serie de mici diferențe.
În primul rând, Închidere
are o sintaxă foarte concisă. Parametrii nu au o declarație de tip (pentru a fi mai precis, ei o au, dar astfel de declarații sunt ascunse). Închiderea are un comportament special - "ultima declarație este o valoare de returnare" - ceea ce înseamnă că ar trebui să utilizați ?1;
? (în ultima linie) în loc de ?retur 1;
?
În al doilea rând, are o viziune specială pentru închiderile cu o singură linie - într-o astfel de închidere, un semicolon la capăt este omis (din două motive: lizibilitatea și scurta).
Spre deosebire de o funcție anonimă (și, de asemenea, ca o contrare a celor de mai sus Arrays
și Vectorii
), o închidere este tip sigur. Aceasta înseamnă că autocompletarea și verificarea de tip vor funcționa în închideri.
În concluzie, a Închidere
este un fel de funcție pe steroizi. Are o mulțime de caracteristici gustoase care ne ajută să scriem totul rapid și concis.
Să ne întoarcem la închiderea neterminată. Adăugați un cod care va implementa "regulile" noastre. Acest cod va returna o versiune descrescătoare din candidatesLongList
care nu include nici unul dintre urmașii noștri:
Apoi adăugați un alt criteriu:
Teoretic, Colecții limbajul vă permite să cuibărați o mulțime de condiții diferite unul câte unul. Să adăugăm încă un criteriu (includeți utilizatorii care au "Flash", "ActionScript" sau "Adobe" în câmpul Biografie), folosind o expresie regulată:
Selectați întreaga interogare și apăsați Ctrl-Alt-V. Va fi introdusă o nouă variabilă.
Acum suntem capabili să facem tot ce ne dorim:
Am copia apoi conținutul rezultat
în candidatesShortList
.
Construiți un modul cu Ctrl-F9 și aruncați o privire la producție fereastră. Codul AS3 generat pur Principal()
va arata astfel:
pachet com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; import flash.display.Sprite; clasa publică principală extinde Sprite followers privat var: Array = new Array (); private var urmărit înainte: Array = array nou (); private var candidateLongList: Array = Array nou (); private var candidatesShortList: Array = Array nou (); funcția publică () // excludeți pe urmașii noștri și pe utilizatorii urmăriți de noi înainte de a include // adăugați-le pe toți la lista scurtă de recomandări this.candidatesShortList = CollectionsLanguageUtil unde: (SubscribersLanguageUtil.where (candidațiLongList, funcția (n: TwitterAccount, oprește: Object): Boolean return collectionsLanguageUtil.any (followers, function (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, aceasta, falsă) &&! ColecțiiLanguageUtil.any (urmatÎnainte, funcția (f: TwitterAccount, stop: Object): Boolean return f.user.id! = n.user.id; acest lucru, false);, aceasta, falsă), funcția (ea: TwitterAccount, stop: Object): Boolean return /Flash|ActionScript|Adobe/.test(it.bio);, aceasta este falsă); var nume: Array = CollectionsLanguageUtil.select (candidațiiShortList, funcția (it: TwitterAccount, stops: Object): String return it.user.username + "," + it.user.surname; ColecțiiLanguageUtil.forEach (nume, funcție (m: String, stop: Obiect): void // TODO: faceți ceva cu 'm', acest lucru este fals);
Pare puțin improbabil, nu? Mai ales în comparație cu codul nostru DSL:
Noua extensie de limbă pentru Colecții vă permite: