Программирование на Lua | ||
Часть I. Язык Глава 4. Операторы |
Обобщенная форма цикла for позволяет отслеживать все значения, возвращенные функцией-итератором. Ранее уже приводился пример обобщенного for:
-- вывод всех значений массива 'a' for i,v in ipairs(a) do print(v) endНа каждом шаге этого кода,
i
получает индекс, а v
- значение, ассоциированное с этим индексом. Подобный же пример показывает прохождение по всем ключам таблицы:
-- вывод всех ключей таблицы 't' for k in pairs(t) do print(k) endНесмотря на видимую простоту, обобщенный for весьма функционален. With proper iterators, we can traverse almost anything, and do it in a readable fashion. Стандартная библиотека предлагает несколько итераторов, позволяющих проходить по строкам в файле (
io.lines
), парам в таблице (pairs
), словам в строке (string.gfind
, рассматриваемая в Главе 20) и другие. Конечно, можно использовать и собственные итераторы. Хотя использовать обобщенный for просто, задача написания функций-итераторов имеет свои особенности. Эта тема будет рассмотрена позже, в Главе 7.
Обобщенная и числовая формы цикла имеют два общих свойства: управляющие переменные являются локальнымидля тела цикла их нельзя изменять.
А теперь несколько более конкретный пример использования обобщенного for. Предположим, у вас есть таблица, собержащая название дней недели:
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}А теперь вы хотите перевести имя в его положение в неделе. Можно искать в таблице, просматривая полученные имена. Чаще, однако, более эффективным подходом в Lua будет построить обратную таблицу сименем
revDays
, в которой имена являются индексами, а номера - значениями. Такая таблица будет выглядеть так:
revDays = {["Sunday"] = 1, ["Monday"] = 2, ["Tuesday"] = 3, ["Wednesday"] = 4, ["Thursday"] = 5, ["Friday"] = 6, ["Saturday"] = 7}Теперь все, что вам нужно сделать - это найти соответствующее имя и индексировать им таблицу:
x = "Tuesday" print(revDays[x]) --> 3Естественно, обратную таблицу не обязательно объявлять вручную. Можно построить ее автоматически на основе таблицы days:
revDays = {} for i,v in ipairs(days) do revDays[v] = i endЦикл будет выполнять присваивание для каждого элемента
days
, причем переменная i
получает индекс (1, 2, ...), а v
- значение ("Sunday"
, "Monday"
, ...).
Copyright © 2003-2004 Roberto Ierusalimschy. All rights reserved. | Перевод на русский Artem13 |