Bonnes nouvelles tout le monde. Tout le monde qui travaille avec des tableaux et des vecteurs - donc, tous les développeurs - profitera des nouvelles opportunités: depuis la version de Flash fin Août 2011, Realaxy ActionScript Editor (RASE) prend en charge le nouveau Des collections Extension de langue AS3. Dans ce post, nous vous montrerons ce qu'il peut faire.
Une collection est un terme général qui signifie, en gros, "un groupe d'objets de même type qui sont regroupés". La création d'une collection dans ActionScript 3.0 peut être réalisée à l'aide de tableaux, de vecteurs, de dictionnaires ou d'objets. ils ont chacun les ingrédients d'un concept parfait. Cependant, si vous avez une connaissance élémentaire de tout langage moderne et tendance comme Scala, Groovy ou Ruby, vous ressentirez certainement l’absence d’une approche fonctionnelle dans le traitement AS3 pur..
Eh bien, introduisons le Des collections Extension de langue AS3 disponible dans RASE Beta 10, build 8177+.
Un vocabulaire complet de méthodes complétées avec des exemples est disponible ici: un pour les listes et un autre pour les cartes (ce sont des images; faites-les défiler, elles sont vraiment énormes).
Afin de ne pas vous perdre dans cette jungle, examinons quelques cas d'utilisation simples. Le premier échantillon true-life démontre la concision du code de collection:
Nous créons un liste
, qui ne peut contenir que int
valeurs.
où
?).sélectionner
?).sélectionner
?).liste
et trace le résultat.Où
, sélectionner
, selectMany
- ces opérations sont faciles à utiliser lorsque vous construisez une requête.
Des opérations comme tout
, tout
, contientTout
, et contient
fonctionne parfaitement dans les phrases conditionnelles (?si
? déclarations, etc.).
Pour modifier une liste, nous disposons d’un large éventail d’armes: retirer
, Enlever tout
, enleverOù
, enleverTête
, removeTail
, etc.
Pour les personnes qui ont vraiment un oeil pour la perversion, nous avons préparé un tas d'opérations comme foldLeft
/foldRight
, réduire le reste
/réduire à droite
, couper
, etc.
En termes simples, il existe de nombreuses opérations adaptées à chaque fantaisie et à presque toutes les tâches. Dans certaines opérations, vous ne lui transmettez qu'une ou plusieurs valeurs, dans d'autres, vous ajoutez une fermeture..
Le langage de collecte est intentionnellement simple. Il supporte deux types: liste
et Carte
. Carte
est assez similaire à un trivial dictionnaire
qui détient des méthodes utiles - clés
, valeurs
, contient la clé
, contientValeur
(utile pour les contrôles et conditions), PushMap
(pour fusionner des valeurs), removeKey
, removeValue
, etc.
Les cartes sont intelligentes et sans faille. Ils ne vous laisseront pas ajouter une clé ou une valeur incorrecte:
Les cartes fonctionnent bien avec toutes les listes et les requêtes.
Il existe également des opérations de conversion qui peuvent être utilisées pour faciliter l'intégration des nouvelles extensions Collections à votre projet réel ActionScript. Il suffit de prendre un tableau trivial (ou un vecteur) et d'appliquer le .lister
opération. Après avoir traité une liste (ou une carte), vous pouvez toujours la reconvertir au style AS3 de la vieille école à l'aide de .toArray
ou .toVector
.
Pour montrer comment utiliser ces collections, voici un guide détaillé basé sur une situation triviale. Supposons que votre tâche consiste à créer une liste des "utilisateurs suggérés" pour un compte Twitter. Nous devons traiter une très longue collection de centaines ou de milliers d'objets, récupérer une liste courte (correspondant à un certain nombre de critères) et appliquer une opération sur chaque élément de cette liste courte..
Nous ne tournerons pas notre attention vers l’interaction avec l’API de Twitter, car notre objectif n’est que de montrer comment utiliser le Des collections langue et de montrer les avantages d’une approche fonctionnelle du travail avec les collections dans AS3.
Créez un nouveau projet à partir de zéro et nommez-le Collections. S'il s'agit de votre première expérience avec l'éditeur, nous vous recommandons de lire le tutoriel de Réalaxy HelloWord et / ou la présentation de Réalaxy pour les débutants..
Nous devons maintenant créer trois classes pour stocker la structure de données: Utilisateur
,яCompte Twitter
et Message
. Nous pouvons le faire à partir du produire
menu, accessible en cliquant avec le bouton droit sur le code ou en appuyant sur Ctrl + N.
Tapez le nom de la classe dans une boîte de dialogue.
Aller à theя<
яposition et hitяEntrer
.
Ajoutez les champs suivants: Nom d'utilisateur
, nom de famille
et identifiant
. Le code ressemblera à ceci:
Invoquer le Ctrl + N menu à nouveau.
Une nouvelle fenêtre pop-up apparaîtra. Sélectionnez tous les champs nouvellement créés et appuyez sur D'accord.
.toString ()
MéthodeN'oubliez pas d'ajouter une présentation textuelle au Utilisateur
classe. Ajouter .toString ()
method - élément 5 de theяCtrl-N menu (identique à la capture d'écran des étapes 2 et 6).
le Utilisateur
la classe est prête. Son code ressemblera à ceci:
En utilisant le même processus que les étapes 2 à 9, vous devez créerCompte Twitter
яandяMessage
Des classes.
я
NB: Pour éviter une erreur de type (comme celle montrée dans l’image ci-dessus), vous devez importer le fichier. Des collections
langue de theяCtrl + L menu:
NB2: яThe Compte Twitter
et Message
Les classes doivent être réticulées. Pour ce faire, après avoir importé le fichier Des collections
langue, vous devez créer le Message
classe, retourne à la Compte Twitter
classe et complète la ligne qui a causé une erreur.
NB3: N'oubliez pas d'ajouter des accesseurs, des setters et un .toString ()
méthode.
Maintenant il est temps d'écrire du code Principale()
. Tout d’abord, nous devons ajouter quelques champs.
NB: Utilisez le raccourci clavier de l’aSmart Complete (Ctrl-Maj-Espace) économiser un peu de temps en tapant ces phrases:
Comme notre tutoriel est juste une démo qui montre comment utiliser les collections dans AS3, nous allons ignorer la partie qui explique comment obtenir ces données à partir de l'API Twitter..
Imaginons que nous ayons déjà:
suiveurs
,яsuiviAvant
,candidatsLongList
,candidatsShortList
, qui est tentant pour le moment.La troisième collection peut être extrêmement volumineuse et contenir des centaines voire des milliers d’articles. Notre but est d'appliquer une requête sophistiquée et ainsi de couper les objets inutiles selon le principe de Buonarotti. J'ai vu l'ange dans le marbre et sculpté jusqu'à ce que je le libère..?
Sauter à Principale()
яconstructor, et entrez lecandidatsLongList
avec sa méthode ?où
? (frappé Ctrl-Espace utiliser l'auto-complétion comme dans la capture d'écran ci-dessous):
La phrase suivante apparaîtra:
Ne soyez pas surpris, c'est juste un Fermeture
, et "il
"est juste son paramètre.
Une fermeture est en fait la même fonction anonyme, mais avec quelques petites différences.
Premièrement le Fermeture
a une syntaxe très concise. Les paramètres n'ont pas de déclaration de type (pour être plus précis, ils l'ont, mais de telles déclarations sont masquées). La fermeture a un comportement spécial - - la dernière instruction est une valeur de retour - ce qui signifie que vous devez utiliser ?1;
? (dans la dernière ligne) au lieu de ?retourne 1;
?
Deuxièmement, il a une vue spéciale pour les fermetures à une ligne - dans une telle fermeture, un point-virgule à la fin est omis (pour deux raisons: lisibilité et brièveté).
Contrairement à une fonction anonyme (et aussi en tant que contrecoup de la précédente Tableaux
et Les vecteurs
), une fermeture est tapez safe. Cela signifie que la saisie semi-automatique et la vérification de type fonctionneront dans les fermetures..
Pour conclure, un Fermeture
est une sorte de fonction sur les stéroïdes. Il a beaucoup de fonctionnalités savoureuses qui nous aident à écrire tout rapidement et de manière concise.
Revenons à notre fermeture inachevée. Ajoutez du code qui implémentera nos "règles". Ce code renverra une version réduite de candidatsLongList
cela n'inclut aucun de nos adeptes:
Puis ajoutez un autre critère:
Théoriquement, le Des collections La langue vous permet d'imbriquer de nombreuses conditions différentes une par une. Ajoutons un critère supplémentaire (inclure les utilisateurs qui ont «Flash», «ActionScript» ou «Adobe» dans leur champ Biography) lors de l'utilisation d'une expression régulière:
Sélectionnez la requête entière et appuyez sur Ctrl-Alt-V. Une nouvelle variable sera introduite.
Maintenant nous pouvons faire ce que nous voulons:
Nous copierions ensuite le contenu de résultat
dans candidatsShortList
.
Construire un module avec Ctrl-F9 et jetez un oeil à la Sortie la fenêtre. Le code AS3 pur généré de Principale()
ressemblera à ceci:
package com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; import flash.display.Sprite; public class Main étend Sprite followers privés privés: Array = new Array (); var privée suivieAvant: Array = new Array (); private var candidatesLongList: Array = new Array (); private var candidatesShortList: Array = new Array (); fonction publique Main () // exclut nos suiveurs et utilisateurs suivis par nous avant // incluent les personnes avec "Flash", "ActionScript" et "Adobe" dans leur bio // les ajoute tous aux recommandations shortlist this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (candidatsLongList, fonction (n: TwitterAccount, stops: Object)): Boolean return! CollectionsLanguageUtil.any (suiveurs, fonction (f: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (suiveurs, fonction (f: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (suiveurs, function (f: TwitterAccount, stops: Object)): Boolean return! = n.user.id;, this, false) &&! CollectionsLanguageUtil.any (suiviAvant, fonction (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); noms var: Array = CollectionsLanguageUtil.select (candidatesShortList, fonction (it: TwitterAccount, stops: Object): String return it.user.username + "," + it.user.surname;, this, false); CollectionsLanguageUtil.forEach (noms, fonction (m: chaîne, arrête: objet): void // TODO: fait quelque chose avec 'm', this, false);
Cela semble un peu illisible, hein? Surtout en comparant avec notre code DSL:
La nouvelle extension linguistique de Collections vous permet de: