La fonction de générateur est difficile à expliquer, mais en un mot, c'est une "fonction qui renvoie une valeur en petites quantités (une fonction qui crée)". En Python, par exemple, vous pouvez l'utiliser comme ceci. Cela peut être appelé une fonction qui crée un italateur.
def firstn(n):
num = 0
while num < n:
yield num
num += 1
gen = firstn(10)
print gen.next() # —> 0
print gen.next() # —> 1
print gen.next() # —> 2
…
print gen.next() # —>11ème fois qu'une exception StopIteration se produit
Bien sûr, il peut également être utilisé pour les boucles for et la notation d'inclusion de liste.
for n in firstn(10):
print n,
# —> 0 1 2 3 4 5 6 7 8 9
print [n for n in firstn(10)]
# -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Il semble donc que cette fonction de générateur puisse également être utilisée en JavaScript. Il sera officiellement standardisé dans ES6 (ECMAScript version 6), mais certaines implémentations ont déjà commencé à intégrer cette fonctionnalité.
Node.js sera également officiellement adopté dans la prochaine version stable v0.12, de sorte que le générateur pourra être utilisé dans la v0.11. Alors j'ai essayé de l'utiliser.
Tout d'abord, réécrivez l'exemple ci-dessus en JavaScript.
firstn = function* (n) {
var num = 0
while (num < n) {
yield num
num += 1
}
};
gen = firstn(10);
console.log(gen.next()); // —> { value: 0, done: false }
console.log(gen.next()); // —> { value: 1, done: false }
console.log(gen.next()); // —> { value: 2, done: false }
…
console.log(gen.next()); // —>11e fois{ value: undefined, done: true }Retour
La différence avec Python est qu'il ne renvoie pas de valeur, mais un objet avec deux attributs, value et done. Lorsque l'itération est terminée, done est vrai au lieu de lever une exception.
Au moment de l'exécution, utilisez node —harmony
. "Harmony" semble être le nom de code de l'ES6.
Et cela peut également être utilisé dans une boucle for
for (n of firstn(10)) {
process.stdout.write(n + " ");
}
// —> 0 1 2 3 4 5 6 7 8 9
Il semble que la notation d'inclusion de liste sera disponible dans ES6, mais elle n'est pas prise en charge dans la dernière version actuelle (0.11.9). Pardon.
Recommended Posts