Fråga (och erövra) stora samlingar i AS3 med Realaxy Editor

Goda nyheter, alla. Alla som arbetar med arrays och vektorer - så, alla utvecklare - kommer att njuta av de nya möjligheterna: Sedan slutet av augusti 2011 byggd av Flash, stödjer Realaxy ActionScript Editor (RASE) den nya samlingar AS3-språkförlängning. I det här inlägget visar vi vad det kan göra.

En samling är en allmän term som betyder ungefär en massa liknande typade objekt som är grupperade ihop. Att bygga en samling i ActionScript 3.0 kan göras med hjälp av arrayer, vektorer, ordböcker eller objekt; De har varje del av ett perfekt koncept. Men om du ens har en grundläggande bekantskap med något modernt och trendigt språk som Scala, Groovy eller Ruby, kommer du definitivt att känna bristen på ett funktionellt tillvägagångssätt i den rena AS3-sättet att bearbeta samlingar.


Samlingsspråket

Tja, låt oss presentera samlingar AS3-språktillägg som finns i RASE Beta 10, bygg 8177+.

En fullständig ordförråd av metoder kompletterade med prover finns här: en för listor och en annan för kartor (det här är bilder, rulla ner dem, de är verkligen stora).

För att inte gå vilse i denna djungel, låt oss ta en titt på några enkla användningsfall. Det första sanna livet provet visar uppgiften för insamlingskoden:

Vi skapar en lista, som endast kan innehålla int värden.

  1. Då väljer vi bara de som uppfyller ett villkor (?var?).
  2. Vi gör något med varje plockat element (?Välj?).
  3. Vi konverterar dem till strängar (?Välj?).
  4. Slutligen cyklar vi igenom lista och spåra resultatet.

Var, Välj, selectMany - Dessa operationer är lätta att använda när du bygger en fråga.

Verksamhet som Allt, några, containsAll, och innehåller arbeta perfekt i villkorliga fraser (?om? uttalanden mm).

För att ändra en lista har vi ett brett utbud av vapen: ta bort, ta bort alla, removeWhere, removeHead, removeTail, etc.

För de personer som definitivt har ett öga för perversion har vi förberett en massa aktiviteter som foldLeft/foldRight, reduceLeft/reduceRight, korsas, etc.

Enkelt sagt, det finns gott om operationer som passar alla fina och nästan alla uppdrag. I vissa operationer sänder du bara en eller flera värden till den, i vissa andra lägger du till en nedläggning.


Listor och kartor

Samlingsspråket är avsiktligt enkelt. Den stöder två typer: Lista och Karta. Karta är ganska lik en trivial Ordbok som innehåller några användbara metoder - nycklar, värden, containsKey, containsValue (användbar för kontroller och villkor), pushMap (för att slå samman värden), removeKey, removeValue, etc.

Kartor är smarta och felsäkra. De låter dig inte lägga till en felaktig nyckel eller ett värde:

Kartor fungerar bra med några listor och frågor.

Det finns också konverteringsoperationer som kan användas för att underlätta inbäddning av de nya samlingsutvidgningarna till ditt verkliga rena ActionScript-projekt. Ta bara ett trivialt array (eller vektor) och tillämpa .att lista drift. Efter att ha bearbetat en lista (eller en karta) kan du alltid konvertera den till gammal-skolan AS3-stil med .toArray eller .till vektor.


Ett verkligt världsexempel

För att visa hur man börjar med dessa samlingar är här en steg-för-steg guide baserad på en trivial situation. Antag att din uppgift är att skapa en "föreslagen användare" lista för ett Twitter-konto. Vi måste bearbeta en mycket lång samling av hundratals eller tusentals objekt, för att hämta en kort lista (som matchar ett antal kriterier) och att tillämpa en operation på varje objekt på den korta listan.

Vi kommer inte att uppmärksamma oss på att interagera med Twitter API, eftersom vårt mål bara är att visa hur du kommer igång med samlingar språk och för att visa fördelar med ett funktionellt tillvägagångssätt när man arbetar med samlingar i AS3.


Steg 1: Skapa ett projekt

Skapa ett nytt projekt från början och namnge det Collections. Om detta är din första erfarenhet med redaktören rekommenderar vi dig att läsa theяRealaxy HelloWord Tutorial och / orя Realeal Översikt för nybörjare.



Steg 2: Skapa en klass (Börja)

Nu behöver vi skapa tre klasser för att lagra datastrukturen: AnvändareTwitterAccount och Meddelande. Vi kan göra det från Generera menyn, som är tillgänglig genom att högerklicka på koden eller trycka på Ctrl + N.



Steg 3: Skapa en klass (pågår)

Skriv klassnamnet i en popup-ruta.



Steg 4: Skapa en klass (Lägga till fält)

Hoppa till theя<>яposition och hitяStiga på.



Steg 5: яCreating a Class (fler fält)

Lägg till följande fält: Användarnamn, efternamn och id. Koden kommer att se ut så här:



Steg 6: Lägga till Getters och Setters

Invoke the Ctrl + N menyn igen.



Steg 7: Tillägger fortfarande Getters och Setters

Ett nytt popup-fönster visas. Välj alla nyskapade fält och tryck på ok.



Steg 8: Lägga till en .att stränga() Metod

Glöm inte att lägga till en textpresentation till Användare klass. Lägg till .att stränga() metod - punkt 5 från theяCtrl-N meny (samma som på skärmbild till steg 2 och 6).



Steg 9: Kodöversikt

De Användare klassen är klar. Koden kommer att se ut så här:



Steg 10: TwitterAccount och Message Classes

Med samma process som steg 2-9 måste du skapaTwitterAccountяandяMeddelande klasser.

я


Obs! För att undvika ett typfel (som det som visas i bilden ovan) måste du importera samlingar språk från theяCtrl + L meny:


NB2: яThe TwitterAccount och Meddelandeяclasses bör vara tvärbundna. För att detta ska ske, efter att ha importerat samlingar språk, du måste skapa Meddelande klass, hoppa tillbaka till TwitterAccount klass och fyll i raden som orsakade ett fel.


NB3: Glöm inte att lägga getters, setters och a .att stränga() metod.



Steg 11: яMain ()

Nu är det dags att skriva in någon kod Main (). Först måste vi lägga till några fält


Obs! Använd thejaSmart Komplett tangentbordsgenväg (Ctrl-Shift-Space) toяsave lite tid medan du skriver dessa fraser:


Eftersom vår handledning bara är en demo som visar hur man arbetar med samlingar i AS3 hoppar vi över den del som hänvisar till hur man får denna data från Twitter API.

Låt oss föreställa oss att vi redan har:

  1. en lista över ourяföljare
  2. en lista över användare followedBefore,
  3. en mycket lång lista över potentiella kandidater för att följa - candidatesLongList,
  4. och, naturligtvis, ajacandidatesShortList, vilket är just nu.

Den tredje samlingen kan vara extremt stor, innehållande hundratals eller till och med tusentals objekt. Vårt mål är att tillämpa ett sofistikerat frågeformulär och sålunda att skära bort de obetydliga föremålen enligt Buonarottis princip? Jag såg ängeln i marmorn och huggades tills jag satte honom fri.?


Steg 12: Bygga frågan

Hoppa till Main ()яconstructor, och skriv in theяcandidatesLongListя med sin metod ?var? (träffa Ctrl-Space att använda autokompletion som i skärmbilden nedan):


Följande fras kommer att visas:


Bli inte förvånad, det är bara en Stängning, och "Det"är bara dess parameter.


Stängningar (en liten lyrisk utpressning)

En stängning är i själva verket samma anonyma funktion, men med ett antal små skillnader.

Först, det Stängning har en mycket kortfattad syntax. Parametrarna har ingen typdeklaration (för att vara mer exakt, de har det, men sådana deklarationer är dolda). Stängningen har ett särskilt beteende - det sista uttalandet är ett returvärde & rdquo - vilket innebär att du ska använda ?1;? (i den sista raden) istället för ?returnera 1;?

För det andra har den en speciell vy för enstaka stängningar - i en sådan stängning utelämnas en halvkolon i slutet (av två skäl: läsbarhet och korthet).

Till skillnad från en anonym funktion (och även som en räknare mot det ovan nämnda arrayer och vektorer), en stängning är skriv säkert. Det innebär att autofyllning och typkontroll kommer att fungera i stängningar.

Avslutningsvis a Stängning är en slags funktion på steroider. Den har många läckra funktioner som hjälper oss att skriva allt snabbt och noggrant.


Steg 13: Bygga frågan

Låt oss återvända till vår oavslutade stängning. Lägg till en kod som kommer att genomföra våra "regler". Denna kod kommer att returnera en nedskärningsversion av candidatesLongList det inkluderar inte någon av våra anhängare:


Lägg sedan till ett annat kriterium:


Teoretiskt sett samlingar språket tillåter dig att hyra många olika förhållanden en efter en. Låt oss lägga till ytterligare ett kriterium (inkludera användare som har? Flash ?,? ActionScript? Eller? Adobe? I deras Biography-fält) яusing ett regelbundet uttryck:



Steg 14: Skaffa resultatet

Välj hela frågan och tryck på Ctrl-Alt-V. En ny variabel kommer att introduceras.

Nu kan vi göra vad vi vill ha:

Vi skulle då kopiera innehållet i resultat in i candidatesShortList.


Steg 15: Generera ren AS3-kod

Bygg en modul med Ctrl-F9 och ta en titt på Produktion fönster. Den genererade rena AS3-koden för Main () kommer att se ut så här:

 paketet com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; importera flash.display.Sprite; public class Main utökar Sprite private var-anhängare: Array = new Array (); privat var följt före: Array = ny Array (); private var candidatesLongList: Array = new Array (); private var candidatesShortList: Array = new Array (); public function Main () // utesluta våra följare och användare följt av oss innan // inkludera personer med "Flash", "ActionScript" och "Adobe" i deras bio // lägg till dem alla till rekommendationerna shortlist this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (candidatesLongList, function (n: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (följare, funktion (f: TwitterAccount, stopp: Objekt): Boolean return f.user.id! = n.user.id;, detta, false) &&! CollectionsLanguageUtil.any (followedBefore, funktion (f: TwitterAccount, stannar: Objekt): Boolean return f.user.id! = n.user.id;, detta, falskt);, detta, falskt), funktion (det: TwitterAccount, stannar: Objekt): Booleskt (returnera /Flash|ActionScript|Adobe/.test(it.bio);, detta, false); var namn: Array = SamlingarLanguageUtil.select (candidatesShortList, funktion (it: TwitterAccount, stops: Object): String returnera det.user.username + "," + it.user.surname;, this, false); SamlingarLanguageUtil.forEach (namn, funktion (m: String, stopp: Objekt): void // TODO: gör något med 'm', detta, false); 

Verkar lite oläslig, va? Särskilt jämförelse med vår DSL-kod:


Slutsats

Den nya samlingens språkutvidgning gör att du kan:

  • förbättra din AS3-kod vilket gör den mer koncis,
  • gör din kod mer humanläsbar, och
  • underlätta förvandling av din sekventiella kod till parallell kod.