Я придумал этот простой эксперимент после чтения документации по генераторам из 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);
}
Запуск на node.js v0.11.9 с установленным флагом --harmony
вызывает следующую ошибку:
[email protected]:~$ node --version
v0.11.9
[email protected]:~$ node --harmony test.js
/home/alix/test.js:14
yield suffix;
^^^^^^
SyntaxError: Unexpected identifier
Я также попытался использовать for ... in ...
и ключевое слово let
вместо var
, но без каких-либо успехов.
Я не понимаю то, что yield*
делает точно, но если я использую его в цикле for
, я получаю вместо этого:
[email protected]:~$ node --harmony test.js
/home/alix/test.js:14
yield* suffix;
^
ReferenceError: yield is not defined
Если я заменил выход в for на console.log()
, он выведет a
, b
и c
. Что я делаю неправильно?
Изменить
Здесь минималистский генератор, показывающий, что node.js знает, что делать с генераторами:
function* alpha() {
yield 'a';
yield 'b';
yield 'c';
}
for (var suffix of alpha()) {
console.log(suffix);
}
Вывод:
[email protected]:~$ node --harmony y.js
a
b
c
Решение (спасибо @Andrew)
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);
}