Вопрос:

Symbol.Iterator - передать аргумент

javascript node.js ecmascript-6

50 просмотра

2 ответа

963 Репутация автора

У меня проблема с кодом JavaScript.

Как я могу сделать этот кусок кода параметризованным? Я имею в виду изменение 10 на переменную, которую я могу передать в качестве аргумента.

function createGenerator() {
var _state = 0;
return {
    next() {
        if (_state < 10) {
            return { value: _state++ };
        } else {
            return { done: true };
        }
    }
  }
}
var iterable = {
   [Symbol.iterator] : createGenerator
};
for (var f of iterable) {
   console.log(f)
}
Автор: KarlR Источник Размещён: 08.11.2017 11:02

Ответы (2)


2 плюса

2734 Репутация автора

Решение

Вы можете передать его в качестве аргумента, а затем bindсвою createGeneratorфункцию.

т.е.

function createGenerator(num) {
var _state = 0;
return {
    next() {
        if (_state < num) {
            return { value: _state++ };
        } else {
            return { done: true };
        }
    }
  }
}
var iterable = {
   [Symbol.iterator] : createGenerator.bind(this,10)
};
for (var f of iterable) {
   console.log(f)
}

Автор: JohanP Размещён: 08.11.2017 11:06

2 плюса

94321 Репутация автора

Использовать частичное применение - внешняя функция получает число и возвращает фактический итератор, который теперь имеет доступ к числу в замыкании:

function createGenerator(n) {
  return function() {
    var _state = 0;
    return {
      next() {
        if (_state < n) {
            return { value: _state++ };
        } else {
            return { done: true };
        }
      }
    }
  }
}


var iterable = {
  [Symbol.iterator]: createGenerator(5)
};
for (var f of iterable) {
  console.log(f)
}

Автор: Ori Drori Размещён: 08.11.2017 11:33
Вопросы из категории :
32x32