Forespørsel (og erobring) Store samlinger i AS3 Med Realaxy Editor

Gode ​​nyheter, alle. Alle som jobber med arrays og vektorer - så, alle utviklere - vil glede seg over nye muligheter: siden Real August ActionScript Editor (RASE) siden slutten av august 2011 bygger Flash, støtter Realaxy ActionScript Editor den nye samlinger AS3 språkutvidelse. I dette innlegget vil vi vise deg hva den kan gjøre.

En samling er en generell betegnelse som betyr, omtrent, en haug med tilsvarende skrevet objekter som er gruppert sammen ?. Å bygge en samling i ActionScript 3.0 kan gjøres ved hjelp av arrayer, vektorer, ordbøker eller objekter; de har hver sin del av det perfekte konseptet. Men hvis du har en grunnleggende bekjentskap med et moderne og trendy språk som Scala, Groovy eller Ruby, vil du definitivt føle mangelen på en funksjonell tilnærming i den rene AS3-måten å behandle samlinger.


The Collection Language

Vel, la oss introdusere samlinger AS3 språkutvidelse som er tilgjengelig i RASE Beta 10, build 8177+.

Et komplett vokabular med metoder supplert med prøver er tilgjengelig her: en for lister og en annen for kart (disse er bilder, rull dem ned, de er veldig store).

For ikke å gå seg vill i denne jungelen, la oss ta en titt på noen enkle brukstilfeller. Den første sanntidsprøven demonstrerer konsistensen til innsamlingskoden:

Vi lager en liste, som bare kan inneholde int verdier.

  1. Da velger vi bare de som oppfyller en tilstand (?hvor?).
  2. Vi gjør noe med hvert plukket element (?å velge?).
  3. Vi konverterer dem til Strings (?å velge?).
  4. Til slutt, vi sykler gjennom liste og spore resultatet.

Hvor, å velge, selectMany - Disse operasjonene er enkle å bruke når du bygger et søk.

Operasjoner som alle, noen, containsAll, og inneholder jobbe perfekt i betingede setninger (?hvis? uttalelser osv.).

For å endre en liste har vi et bredt spekter av våpen: fjerne, Fjern alle, removeWhere, removeHead, removeTail, etc.

For de personene som definitivt har øye med perversjon har vi forberedt en rekke operasjoner som foldLeft/foldRight, reduceLeft/reduceRight, krysse, etc.

Bare sagt, det er mange operasjoner som passer til alle fancy og nesten alle oppgaver. I noen operasjoner overfører du bare en eller flere verdier til den, i noen andre legger du til en lukning.


Lister og kart

Samlingsspråket er bevisst enkelt. Den støtter to typer: Liste og Kart. Kart er ganske lik en trivial Ordbok som inneholder noen nyttige metoder - nøkler, verdier, containsKey, containsValue (nyttig for sjekker og forhold), pushMap (for å fusjonere verdier), removeKey, removeValue, etc.

Kartene er smarte og feilsikre. De vil ikke la deg legge til en feil nøkkel eller verdi:

Kart fungerer godt med eventuelle lister og spørringer.

Det er også konverteringsoperasjoner som kan benyttes for å legge til rette for å legge inn de nye samlingsutvidelsene til det faktiske rent-ActionScript-prosjektet. Bare ta et trivielt array (eller vektor) og bruk .ramse opp operasjon. Etter å ha behandlet en liste (eller et kart) kan du alltid konvertere det tilbake til old school AS3-stil ved å bruke .toArray eller .tovector.


En ekte verdeneksempel

For å demonstrere hvordan du kommer i gang med disse samlingene, er det en trinnvis veiledning basert på en triviell situasjon. Anta at oppgaven er å lage en "foreslåtte bruker" -liste for en Twitter-konto. Vi må behandle en svært lang samling av hundrevis eller tusenvis av objekter, for å hente en kort liste (som samsvarer med en rekke kriterier) og å bruke noen operasjon på hvert element i den korte listen.

Vi vil ikke være oppmerksom på å samhandle med Twitter API, siden vårt mål bare er å vise hvordan du kommer i gang med samlinger språk og å vise fordelene med en funksjonell tilnærming i samarbeid med AS3.


Trinn 1: Opprette et prosjekt

Opprett et nytt prosjekt fra bunnen av og kaller det Samlinger. Hvis dette er din første erfaring med redaktøren, anbefaler vi deg å lese theяRealaxy HelloWord Tutorialяand / orяRealaxy Oversikt for nybegynnere.



Trinn 2: Opprette en klasse (begynner)

Nå må vi lage tre klasser for å lagre datastrukturen: BrukerTwitterAccount og Budskap. Vi kan gjøre det fra generere menyen, som er tilgjengelig ved å høyreklikke på koden eller trykke på Ctrl + N.



Trinn 3: Opprette en klasse (i fremgang)

Skriv klassenavnet i en popup-boks.



Trinn 4: Opprette en klasse (legge til felt)

Hopp til theя<>яposition og hitяTast inn.



Trinn 5: яFor en klasse (flere felt)

Legg til følgende felt: brukernavn, etternavn og id. Koden vil se slik ut:



Trinn 6: Legge til Getters og Setters

Invoke Ctrl + N menyen igjen.



Trinn 7: Fortsetter å legge til Getters og Setters

Et nytt popup-vindu vil vises. Velg alle nyopprettede felt og trykk OK.



Trinn 8: Legge til en .toString () Metode

Ikke glem å legge til en tekst presentasjon til Bruker klasse. Legg til .toString () metode - element 5 fra theяCtrl-N meny (samme som på skjermbilde til trinn 2 og 6).



Trinn 9: Kodeoversikt

De Bruker klassen er klar. Koden vil se slik ut:



Trinn 10: TwitterAccount og Message Classes

Ved å bruke samme prosess som trinn 2-9 må du createяTwitterAccountяandяBudskap klasser.

я


NB: For å unngå en type feil (som den som er vist i bildet ovenfor), må du importere samlinger språk fra theяCtrl + L Meny:


NB2: яThe TwitterAccount og Budskapяclasses bør være kryssbundet. For at dette skal skje, etter at du har importert samlinger språk, du må opprette Budskap klasse, hoppe tilbake til TwitterAccount klasse og fullfør linjen som forårsaket en feil.


NB3: Ikke glem å legge getters, setters og a .toString () metode.



Trinn 11: яMain ()

Nå er det på tide å skrive inn noen kode Hoved(). Først må vi legge til noen felt.ja


NB: Bruk thejaSmart Komplett hurtigtast (Ctrl-Shift-Space) toяsave litt tid mens du skriver disse setningene:


Siden vår veiledning er bare en demonstrasjon som viser hvordan du arbeider med samlinger i AS3, hopper vi over delen som refererer til hvordan du får disse dataene fra Twitter API.

La oss bare forestille oss at vi allerede har:

  1. en liste over ourjaetterfølgere
  2. en liste over brukere followedBefore,
  3. en veldig lang liste over potensielle kandidater for å følge - candidatesLongList,
  4. og selvfølgelig ajacandidatesShortList, som er i øyeblikket.

Den tredje samlingen kan være ekstremt stor, som inneholder hundrevis eller tusenvis av elementer. Målet vårt er å bruke noen sofistikert spørring og dermed å kutte ut de unødvendige elementene i henhold til Buonarottis prinsipp? Jeg så engelen i marmor og hugget til jeg satte ham fri.?


Trinn 12: Bygg opp spørringen

Hoppe til Hoved()яconstructor, og skriv inn theяcandidatesLongListя med sin metode ?hvor? (truffet Ctrl-Space å bruke autofullføring som i skjermbildet nedenfor):


Følgende setning vil vises:


Ikke bli overrasket, det er bare en nedleggelse, og "den"er bare dens parameter.


Closures (en liten lyrisk undertrykkelse)

En lukning er faktisk den samme anonyme funksjonen, men med en rekke små forskjeller.

Først nedleggelse har en veldig kortfattet syntaks. Parametrene har ikke en typedeklarasjon (for å være mer presis, de har det, men slike erklæringer er skjult). Lukkingen har en spesiell oppførsel - den siste setningen er en returverdi & rdquo - som betyr at du skal bruke ?1;? (i siste linje) i stedet for ?returnere 1;?

For det andre har det en spesiell visning for enkeltlinjelukninger - i et slikt lukke utelates en halvkolon på slutten (av to grunner: lesbarhet og korthet).

I motsetning til en anonym funksjon (og også som en teller til de nevnte arrays og vektorer), en nedleggelse er skriv trygt. Det betyr at autofullføring og typekontroll vil fungere i lukninger.

Å konkludere, a nedleggelse er en slags funksjon på steroider. Den har mange velsmakende funksjoner som hjelper oss å skrive alt raskt og konsistent.


Trinn 13: Bygg opp spørringen

La oss gå tilbake til vår uferdige nedleggelse. Legg til noen kode som vil implementere våre "regler". Denne koden vil returnere en nedlastingsversjon av candidatesLongList det inkluderer ikke noen av våre tilhengere:


Legg deretter til et annet kriterium:


Teoretisk sett samlinger Språket lar deg neste mange forskjellige forhold en etter en. La oss legge til ett ekstra kriterium (inkludere brukere som har? Flash ?,? ActionScript? Eller? Adobe? I deres Biografi-felt) яusing et vanlig uttrykk:



Trinn 14: Oppnå resultatet

Velg hele spørringen og trykk Ctrl-Alt-V. En ny variabel vil bli introdusert.

Nå er vi i stand til å gjøre hva vi vil:

Vi ville da kopiere innholdet i resultat inn i candidatesShortList.


Trinn 15: Genererer ren AS3-kode

Bygg en modul med Ctrl-F9 og ta en titt på Produksjon vindu. Den genererte rene AS3-koden til Hoved() vil se slik ut:

 pakke com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; importer flash.display.Sprite; offentlig klasse Hoved utvider Sprite private var følgere: Array = new Array (); privat var followedBefore: Array = new Array (); private var kandidaterLongList: Array = new Array (); private var candidatesShortList: Array = new Array (); offentlig funksjon Main () // ekskluder våre etterfølgere og brukere etterfulgt av oss før // inkludere folk med "Flash", "ActionScript" og "Adobe" i deres bio // legge dem alle til anbefalingene shortlist this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (kandidaterLongList, funksjon (n: TwitterAccount, stopp: Objekt): Boolsk return! CollectionsLanguageUtil.any (følgere, funksjon (f: TwitterAccount, stopper: Objekt): Boolsk return f.user.id! = n.user.id;, dette, falsk) &&! CollectionsLanguageUtil.any (followedBefore, funksjon (f: TwitterAccount, stopper: Objekt): Boolsk return f.user.id! = n.user.id;, dette, false);, dette, falske), funksjonen (det: TwitterAccount, stopper: Objekt): Boolsk return /Flash|ActionScript|Adobe/.test(it.bio);, dette, falskt); var navn: Array = SamlingerLanguageUtil.select (candidatesShortList, funksjon (det: TwitterAccount, stopper: Objekt): String return it.user.username + "," + it.user.surname;, dette, false); SamlingerLanguageUtil.forEach (navn, funksjon (m: String, stopp: Objekt): void // TODO: gjør noe med 'm', dette, false); 

Virker litt ulæselig, eh? Spesielt å sammenligne med vår DSL-kode:


Konklusjon

Den nye samlingen språkutvidelsen lar deg:

  • forbedre din AS3-kode som gjør det mer konsistent,
  • gjør koden din mer lesbar, og
  • legge til rette for å slå din sekvensielle kode til parallell kode.