Почему итераторы Lua утраивают? - PullRequest
3 голосов
/ 25 апреля 2011

Справочное руководство Lua 5.1 гласит, что итератор

 for var_1, ···, var_n in explist do block end

эквивалентен коду:

 do
   local f, s, var = explist
   while true do
     local var_1, ···, var_n = f(s, var)
     var = var_1
     if var == nil then break end
     block
   end
 end

Почему Lua требует переменную 'state', s ?

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

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Поскольку тройной дизайн не мешает вам использовать замыкание, в то время как альтернативный подход не позволяет использовать , а не , используя замыкания.Иногда дизайн внешнего состояния является более простым подходом.

Например, предположим, что вы используете цикл for для итерации, какие страницы должны отображаться в ответе на запрос RESTful.С помощью циклов на основе внешнего состояния вы можете написать функцию, которая выполняет итерацию страниц на основе таблицы, представляющей параметры представления состояния запроса (которые вы создаете по URL-адресу один раз и повторно используете для нескольких других функций).С помощью троек вы можете выполнять итерации только с этими значениями без необходимости оборачивать их (и все подобные функции) в конструктор замыкания.

2 голосов
/ 25 апреля 2011

Почему бы и нет?Что хорошего в том, чтобы делать это как-то иначе?Как говорят в Microsoft, каждая идея что-то изменить начинается с минус 100 баллов .

...