Goed nieuws, allemaal. Iedereen die met arrays en vectoren werkt - dus, alle ontwikkelaars - zal van de nieuwe mogelijkheden genieten: sinds eind augustus 2011 is de build van Flash, Realaxy ActionScript Editor (RASE) de nieuwe ondersteunt collecties AS3 taaluitbreiding. In deze post laten we je zien wat het kan doen.
Een verzameling is een algemene term die grofweg betekent: een reeks gelijksoortige getypte objecten die zijn gegroepeerd ?. Een verzameling in ActionScript 3.0 bouwen kan worden gedaan met behulp van arrays, vectoren, woordenboeken of objecten; ze hebben elk een aantal van de ingrediënten voor een perfect concept. Als je echter een basiskennis hebt van moderne en trendy talen als Scala, Groovy of Ruby, zul je zeker het ontbreken van een functionele aanpak voelen in de pure AS3-manier van verwerken Collecties.
Nou, laten we het introduceren collecties AS3-taaluitbreiding die beschikbaar is in RASE Beta 10, build 8177+.
Een complete woordenschat van methoden aangevuld met voorbeelden is hier beschikbaar: een voor lijsten en een andere voor kaarten (dit zijn afbeeldingen; scroll ze naar beneden, ze zijn echt enorm).
Laten we, om niet verdwaald te raken in deze jungle, enkele eenvoudige use-cases bekijken. De eerste waarheidsgetrouwe steekproef demonstreert de beknoptheid van de verzamelcode:
We creëren een lijst
, die alleen kan bevatten int
waarden.
waar
?).kiezen
?).kiezen
?).lijst
en traceer het resultaat.Waar
, kiezen
, SelectMany
- deze bewerkingen zijn eenvoudig te gebruiken wanneer u een query aan het maken bent.
Operaties zoals allemaal
, ieder
, containsAll
, en bevat
werken perfect in voorwaardelijke zinnen (?als
? verklaringen, enz.).
Om een lijst te wijzigen, hebben we een breed scala aan wapens: verwijderen
, Verwijder alles
, removeWhere
, removeHead
, removeTail
, enz.
Voor die personen die beslist oog hebben voor perversie, hebben we een aantal operaties voorbereid zoals foldLeft
/foldRight
, reduceLeft
/reduceRight
, snijden
, enz.
Eenvoudig gezegd, er zijn tal van bewerkingen geschikt voor elke fantasie en bijna elke taak. In sommige bewerkingen zendt u er gewoon een of meer waarden naar toe, bij sommige bewerkingen voegt u een afsluiting toe.
De verzameltaal is opzettelijk eenvoudig. Het ondersteunt twee soorten: Lijst
en Kaart
. Kaart
lijkt veel op een triviaal Woordenboek
dat bevat enkele nuttige methoden - sleutels
, waarden
, containsKey
, containsValue
(handig voor controles en voorwaarden), pushMap
(waarden samenvoegen), removeKey
, removeValue
, enz.
Kaarten zijn slim en veilig. Ze laten u geen onjuiste sleutel of waarde toevoegen:
Kaarten werken goed met alle lijsten en vragen.
Er zijn ook conversiebewerkingen die kunnen worden gebruikt om de insluiting van de nieuwe collecties-extensies in uw werkelijke pure ActionScript-project te vergemakkelijken. Neem gewoon een triviale array (of vector) en pas de .ToList
operatie. Na het verwerken van een lijst (of een kaart) kun je deze altijd converteren naar de old-school AS3-stijl met .toArray
of .toVector
.
Om te laten zien hoe u aan de slag kunt gaan met deze collecties, vindt u hier een stapsgewijze handleiding op basis van een triviale situatie. Stel dat het uw taak is om een lijst met voorgestelde gebruikers voor een Twitter-account te maken. We moeten een zeer lange verzameling van honderden of duizenden objecten verwerken, een korte lijst ophalen (die aan een aantal criteria voldoet) en een bewerking toepassen op elk item in die korte lijst.
We zullen niet onze aandacht richten op de interactie met Twitter API, omdat ons doel alleen is om te laten zien hoe we aan de slag kunnen gaan met de collecties taal en om voordelen van een functionele aanpak te laten zien in het werken met collecties in AS3.
Maak een nieuw project vanuit het niets en noem deze Collecties. Als dit je eerste ervaring met de editor is, raden we je aan om de Horizonaxy HelloWord Tutorial en / of het RSSOne-overzicht voor beginners te raadplegen..
Nu moeten we drie klassen maken om de gegevensstructuur op te slaan: Gebruiker
,яTwitter account
en Bericht
. We kunnen het doen vanuit de voortbrengen
menu, dat beschikbaar is door rechts te klikken op de code of op te drukken Ctrl + N.
Typ de klassenaam in een pop-upvak.
Spring naar theя<
яposition en hitяinvoeren
.
Voeg de volgende velden toe: gebruikersnaam
, achternaam
en ID kaart
. De code ziet er als volgt uit:
Roep de Ctrl + N menu opnieuw.
Een nieuw pop-upvenster verschijnt. Selecteer alle nieuw gemaakte velden en druk op OK.
.toString ()
MethodeVergeet niet om een tekstpresentatie toe te voegen aan de Gebruiker
klasse. Toevoegen .toString ()
methode - item 5 van theяCtrl-N menu (hetzelfde als op screenshot naar stap 2 en 6).
De Gebruiker
klas is klaar. De code ziet er als volgt uit:
Met hetzelfde proces als bij stap 2-9 moet jeя makenTwitter account
яandяBericht
klassen.
я
NB: om een typefout (zoals die in de bovenstaande afbeelding) te voorkomen, moet u de collecties
taal uit theяCtrl + L menu:
NB2: яThe Twitter account
en Bericht
klassen moeten worden gecrosslinked. Om dit te laten gebeuren, na het importeren van de collecties
taal, je moet het maken Bericht
klasse, spring terug naar de Twitter account
class en voltooi de regel die een fout veroorzaakte.
NB3: Vergeet niet om getters, setters en a toe te voegen .toString ()
methode.
Nu is het tijd om wat code te schrijven Hoofd()
. Eerst moeten we een aantal velden toevoegen.я
NB: Gebruik de? Smart complete sneltoets sneltoets (Ctrl-Shift-Space) om een beetje tijd te nemen terwijl je deze zinnen typt:
Omdat onze tutorial slechts een demo is die laat zien hoe met collecties in AS3 te werken, slaan we het gedeelte dat verwijst naar hoe deze data van Twitter API haalt, over.
Laten we ons voorstellen dat we al:
volgelingen
,яfollowedBefore
,candidatesLongList
,candidatesShortList
, die momenteel leeg is.De derde verzameling kan extreem groot zijn en honderden of zelfs duizenden items bevatten. Ons doel is om een gesofisticeerde query toe te passen en zo de onnodige items af te snijden volgens het principe van Buonarotti? Ik zag de engel in het marmer en uitgehouwen totdat ik hem bevrijdde.?
Spring naar Hoofd()
яconstructor, en ga theя incandidatesLongList
met zijn methode ?waar
? (raken Ctrl-Space om automatische aanvulling te gebruiken zoals in de onderstaande schermafbeelding):
De volgende zin verschijnt:
Wees niet verrast, het is gewoon een Sluiting
, en "het
"is gewoon zijn parameter.
Een sluiting is in feite dezelfde anonieme functie, maar met een aantal kleine verschillen.
Eerst de Sluiting
heeft een zeer beknopte syntaxis. Parameters hebben geen typeaangifte (om precies te zijn, ze hebben het, maar dergelijke verklaringen zijn verborgen). De afsluiting heeft een speciaal gedrag - de laatste instructie is een retourwaarde & rdquo - wat betekent dat u moet gebruiken ?1;
? (in de laatste regel) in plaats van ?terug 1;
?
Ten tweede heeft het een speciaal aanzicht voor sluitingen met één regel - bij een dergelijke sluiting is een puntkomma aan het uiteinde weggelaten (om twee redenen: leesbaarheid en beknoptheid).
In tegenstelling tot een anonieme functie (en ook als een tegenwicht tegen de eerder genoemde arrays
en vectoren
), een sluiting is type veilig. Dat betekent dat autocomplete en typecontrole in sluitingen werken.
Tot slot, een Sluiting
is een soort functie op steroïden. Het heeft veel smakelijke functies die ons helpen alles snel en beknopt te schrijven.
Laten we terugkeren naar onze onafgemaakte sluiting. Voeg een code toe die onze "regels" zal implementeren. Deze code retourneert een versimpelde versie van candidatesLongList
dat is niet inclusief onze volgers:
Voeg vervolgens nog een criterium toe:
Theoretisch gezien, de collecties taal stelt u in staat verschillende voorwaarden één voor één te nesten. Laten we nog een criterium toevoegen (inclusief gebruikers met? Flash ?,? ActionScript? Of? Adobe? In hun Biografieveld) met een reguliere expressie:
Selecteer de hele query en druk op Ctrl-Alt-V. Er zal een nieuwe variabele worden geïntroduceerd.
Nu kunnen we doen wat we willen:
We zouden dan de inhoud van kopiëren resultaat
in candidatesShortList
.
Bouw een module met Ctrl-F9 en bekijk de uitgang venster. De gegenereerde pure AS3-code van Hoofd()
ziet er zo uit:
package com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; import flash.display.Sprite; public class Hoofd breidt Sprite uit private var followers: Array = new Array (); private var gevolgdVoordat: Array = new Array (); private var candidateLongList: Array = new Array (); private var candidatesShortList: Array = new Array (); public function Main () // sluit onze volgers en gebruikers gevolgd door ons eerder uit // neem mensen op met "Flash", "ActionScript" en "Adobe" in hun bio // voeg ze allemaal toe aan de korte lijst met aanbevelingen this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (candidateLongList, function (n: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (volgers, functie (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, this, false) &&! CollectionsLanguageUtil.any (gevolgd door Before, function (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, this, false);, this, false), function (it: TwitterAccount, stops: Object): Boolean return /Flash|ActionScript|Adobe/.test(it.bio);, this, false); var names: Array = CollectionsLanguageUtil.select (candidateShortList, function (it: TwitterAccount, stops: Object): String return it.user.username + "," + it.user.surname;, this, false); CollectionsLanguageUtil.forEach (names, function (m: String, stops: Object): void // TODO: doe iets met 'm', this, false);
Het lijkt een beetje onleesbaar, toch? Vooral te vergelijken met onze DSL-code:
Met de nieuwe taaluitbreiding van de collecties kunt u: