Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

while((p = s.indexOf( \n')) != -1) {

yield s. substrings, p);

s = s.substring(p+1);

}

if (s.length > 0) yield s;

}

// Функция-генератор, возвращающая f(x) для каждого элемента х итерируемого объекта і

function map(і. f) {

fоr(let x in i) yield f(x);

}

// Функция-генератор, возвращающая элементы і, для которых f(x) возвращает true

function select(i, f) {

for(let x in i) {

if (f(x)) yield x;

}

}

// Обрабатываемый текст

let text = " «comment \n \n hello \nworld\n quit \n unreached \n";

// Сконструировать конвейер генераторов для обработки текста.

// Сначала разбить текст на строки

let lines = eachline(text);

// Затем удалить начальные и конечные пробелы в каждой строке

let trimmed = map(lines, function(line) { return line.trim; });

// Наконец, игнорировать пустые строки и комментарии

let nonblank = select(trimmed, function(line) {

return line.length > 0 && 1ine[0] !=

});

// Теперь извлечь отфильтрованные строки из конвейера и обработать их,

// остановиться, если встретится строка “quit",

for (let line in nonblank) {

if (line === "quit") break; console.log(line);

}

Обычно инициализация генераторов выполняется при их создании: аргументы, передаваемые функции-генератору, являются единственными значениями, которые принимают генераторы. Однако имеется возможность передать дополнительные данные уже работающему генератору. Каждый генератор имеет метод

send,
который перезапускает генератор подобно методу
next.
Разница лишь в том, что методу
send
можно передать значение, которое станет значением, возвращаемым выражением
yield
в функции-генераторе. (В большинстве генераторов, которые не принимают дополнительных входных данных, ключевое слово
yield
выглядит как инструкция. Однако в действительности
yield
– это выражение, возвращающее значение.) Кроме методов
next
и
send
существует еще один способ перезапустить генератор - метод
throw.
Если вызвать этот метод, выражение
yield
возбудит аргумент метода
throw
как исключение, как показано в следующем примере:

// Функция-генератор, ведущая счет от заданного начального значения.

// Метод send позволяет увеличить счетчик на определенное значение.

// Вызов throw("reset") сбрасывает счетчик в начальное значение.

// Это всего лишь пример - здесь метод throw используется не самым лучшим образом,

function counter(initial) {

let nextValue = initial; // Сохранить начальное значение

while(true) {

try {

let increment = yield nextValue; // Вернуть значение и получить приращение

if (increment) // Если передано приращение...

nextValue += increment; // ...использовать его.

else nextValue++; // Иначе увеличить на 1

}

catch (e) { // Если был вызван метод

if (e==="reset") // throw генератора

nextValue = initial; else throw e;

}

}

}

let c = counter(10); // Создать генератор с начальным значением 10

  • Читать дальше
  • 1
  • ...
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: