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.
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.
hvor
?).å velge
?).å velge
?).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.
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
.
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.
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.
Nå må vi lage tre klasser for å lagre datastrukturen: Bruker
,яTwitterAccount
og Budskap
. Vi kan gjøre det fra generere
menyen, som er tilgjengelig ved å høyreklikke på koden eller trykke på Ctrl + N.
Skriv klassenavnet i en popup-boks.
Hopp til theя<
яposition og hitяTast inn
.
Legg til følgende felt: brukernavn
, etternavn
og id
. Koden vil se slik ut:
Invoke Ctrl + N menyen igjen.
Et nytt popup-vindu vil vises. Velg alle nyopprettede felt og trykk OK.
.toString ()
MetodeIkke 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).
De Bruker
klassen er klar. Koden vil se slik ut:
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.
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:
etterfølgere
,яfollowedBefore
,candidatesLongList
,candidatesShortList
, 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.?
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.
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.
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:
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
.
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:
Den nye samlingen språkutvidelsen lar deg: