SyntaxError: Identifiant inattendu (Générateurs dans ES6)
Je suis venu avec cette simple expérience après la lecture de la documentation sur les générateurs de MDN:
var nodes = {
type: 'root',
value: [
{ type: 'char', value: 'a' },
{ type: 'char', value: 'b' },
{ type: 'char', value: 'c' },
],
};
function* recursiveGenerator(node) {
if (node.type === 'root') {
node.value.forEach(function (subnode) {
for (var suffix of recursiveGenerator(subnode)) {
yield suffix;
}
});
}
else {
yield node.value;
}
}
for (generated of recursiveGenerator(nodes)) {
console.log(generated);
}
Cours d'exécution sur node.js v0.11.9 avec le --harmony
indicateur génère l'erreur suivante:
alix@900X4C:~$ node --version
v0.11.9
alix@900X4C:~$ node --harmony test.js
/home/alix/test.js:14
yield suffix;
^^^^^^
SyntaxError: Unexpected identifier
J'ai aussi essayé d'utiliser for ... in ...
et la let
mot-clé au lieu de var
mais sans succès.
Je ne comprends pas ce que rendement*
n'exactementmais si je l'utilise au sein de la for
boucle je reçois à la place:
alix@900X4C:~$ node --harmony test.js
/home/alix/test.js:14
yield* suffix;
^
ReferenceError: yield is not defined
Si je remplace le rendement dans le pour avec console.log()
il sorties a
b
et c
. Ce que je fais mal?
Modifier
Voici un minimaliste générateur, montrant que node.js sait quoi faire avec des générateurs:
function* alpha() {
yield 'a';
yield 'b';
yield 'c';
}
for (var suffix of alpha()) {
console.log(suffix);
}
De sortie:
alix@900X4C:~$ node --harmony y.js
a
b
c
Solution (merci @André)
function* recursiveGenerator(node) {
if (node.type === 'root') {
for (var i = 0; i < node.value.length; ++i) {
var subnode = node.value[i];
for (var suffix of recursiveGenerator(subnode)) {
yield suffix;
}
}
}
else {
yield node.value;
}
}
for (generated of recursiveGenerator(nodes)) {
console.log(generated);
}
source d'informationauteur Alix Axel
Vous devez vous connecter pour publier un commentaire.
Résumant les commentaires: vous ne pouvez pas utiliser
yield
à l'intérieur d'un régulière de la fonction, de sorte que vous ne pouvez pas utiliseryield
avecforEach
. Voici un exemple de "generatorized" foreach:Mise à JOUR
Aussi à l'origine du problème peut être résolu très élégamment en utilisant par exemple un helper:
De sorte que le générateur lui-même devient un one-liner!
Vous avez trouvé votre solution, mais juste pour le record voici un autre exemple un peu différent que d'imprimer les types de tous les nœuds dans l'arbre (j'ai ajouté un peu de profondeur et de vars)
Sorties: