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.
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.
var
?).Välj
?).Välj
?).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.
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
.
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.
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.
Nu behöver vi skapa tre klasser för att lagra datastrukturen: Användare
,яTwitterAccount
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.
Skriv klassnamnet i en popup-ruta.
Hoppa till theя<
яposition och hitяStiga på
.
Lägg till följande fält: Användarnamn
, efternamn
och id
. Koden kommer att se ut så här:
Invoke the Ctrl + N menyn igen.
Ett nytt popup-fönster visas. Välj alla nyskapade fält och tryck på ok.
.att stränga()
MetodGlö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).
De Användare
klassen är klar. Koden kommer att se ut så här:
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.
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:
följare
,яfollowedBefore
,candidatesLongList
,candidatesShortList
, 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.?
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.
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.
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:
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
.
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:
Den nya samlingens språkutvidgning gör att du kan: