💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 55 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 20
Какое правило точнее всего описывает происходящее в строке «for i, v in iter, {2,3,4}, 0 do print(i, v) end»? Нужна именно центральная гарантия раздела «Функция-итератор».
Lua Lua · Функция-итератор · разбор 1 Копировать
local function iter(state, i)
i = i + 1
local v = state[i]
if v then return i, v * v end
end
for i, v in iter, {2,3,4}, 0 do print(i, v) end
Результат кода в разделе «Функция-итератор» объясняет утверждение: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.
Результат кода в разделе «Функция-итератор» объясняет утверждение: Состояние итератора можно хранить в замыкании, но тогда каждый созданный итератор должен иметь собственные захваченные данные, иначе параллельные обходы вмешиваются друг в друга.
Результат кода в разделе «Функция-итератор» объясняет утверждение: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения; синтаксис generic for сам этих гарантий не даёт.
Результат кода в разделе «Функция-итератор» объясняет утверждение: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Результат кода в разделе «Функция-итератор» объясняет утверждение: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной; первое возвращённое значение становится новым управляющим и nil завершает цикл.
Вопрос 2 из 20
Какое последствие проявится только при другом входе или повторном вызове? Ищется граничное следствие правила из раздела «Функция-итератор».
Lua Lua · Функция-итератор · разбор 2 Копировать
local function reproduce_case()
local function iter(state, i)
i = i + 1
local v = state[i]
if v then return i, v * v end
end
for i, v in iter, {2,3,4}, 0 do print(i, v) end
end
reproduce_case()
Проверка отказа в разделе «Функция-итератор» строится вокруг условия: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения; синтаксис generic for сам этих гарантий не даёт.
Проверка отказа в разделе «Функция-итератор» строится вокруг условия: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.
Проверка отказа в разделе «Функция-итератор» строится вокруг условия: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Проверка отказа в разделе «Функция-итератор» строится вокруг условия: Состояние итератора можно хранить в замыкании, но тогда каждый созданный итератор должен иметь собственные захваченные данные, иначе параллельные обходы вмешиваются друг в друга.
Проверка отказа в разделе «Функция-итератор» строится вокруг условия: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной; первое возвращённое значение становится новым управляющим и nil завершает цикл.
Вопрос 3 из 20
Какой результат обязан подтверждать регрессионный тест после правки? Нужен основной контракт раздела «Функция-итератор».
Lua Lua · Функция-итератор · разбор 3 Копировать
do
local function iter(state, i)
i = i + 1
local v = state[i]
if v then return i, v * v end
end
for i, v in iter, {2,3,4}, 0 do print(i, v) end
end
Внешнее поведение раздела «Функция-итератор» сохраняется при условии: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения; синтаксис generic for сам этих гарантий не даёт.
Внешнее поведение раздела «Функция-итератор» сохраняется при условии: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.
Внешнее поведение раздела «Функция-итератор» сохраняется при условии: Состояние итератора можно хранить в замыкании, но тогда каждый созданный итератор должен иметь собственные захваченные данные, иначе параллельные обходы вмешиваются друг в друга.
Внешнее поведение раздела «Функция-итератор» сохраняется при условии: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Внешнее поведение раздела «Функция-итератор» сохраняется при условии: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной; первое возвращённое значение становится новым управляющим и nil завершает цикл.
Вопрос 6 из 20
На каком правиле держится поведение этого кода? Выберите основное правило раздела «Состояние обхода».
Lua Lua · Состояние обхода · разбор 1 Копировать
local function values(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
local a, b = values({1,2}), values({10,20})
print(a(), b(), a())
Центральный механизм раздела «Состояние обхода»: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной; первое возвращённое значение становится новым управляющим и nil завершает цикл.
Центральный механизм раздела «Состояние обхода»: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.
Центральный механизм раздела «Состояние обхода»: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения; синтаксис generic for сам этих гарантий не даёт.
Центральный механизм раздела «Состояние обхода»: Состояние итератора можно хранить в замыкании, но тогда каждый созданный итератор должен иметь собственные захваченные данные, иначе параллельные обходы вмешиваются друг в друга.
Центральный механизм раздела «Состояние обхода»: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Вопрос 7 из 20
Какой крайний случай важнее всего добавить к проверке? Выберите именно проверяемую границу раздела «Состояние обхода».
Lua Lua · Состояние обхода · разбор 2 Копировать
local function reproduce_case()
local function values(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
local a, b = values({1,2}), values({10,20})
print(a(), b(), a())
end
reproduce_case()
Регрессионная проверка раздела «Состояние обхода» наблюдает следующее: Состояние итератора можно хранить в замыкании, но тогда каждый созданный итератор должен иметь собственные захваченные данные, иначе параллельные обходы вмешиваются друг в друга.
Регрессионная проверка раздела «Состояние обхода» наблюдает следующее: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной; первое возвращённое значение становится новым управляющим и nil завершает цикл.
Регрессионная проверка раздела «Состояние обхода» наблюдает следующее: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения; синтаксис generic for сам этих гарантий не даёт.
Регрессионная проверка раздела «Состояние обхода» наблюдает следующее: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Регрессионная проверка раздела «Состояние обхода» наблюдает следующее: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.
Вопрос 8 из 20
Какой смысл фрагмента нельзя спрятать в комментарии вместо проверки? Речь идёт о центральном правиле раздела «Состояние обхода».
Lua Lua · Состояние обхода · разбор 3 Копировать
do
local function values(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
local a, b = values({1,2}), values({10,20})
print(a(), b(), a())
end
Контракт рефакторинга раздела «Состояние обхода»: Состояние итератора можно хранить в замыкании, но тогда каждый созданный итератор должен иметь собственные захваченные данные, иначе параллельные обходы вмешиваются друг в друга.
Контракт рефакторинга раздела «Состояние обхода»: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной; первое возвращённое значение становится новым управляющим и nil завершает цикл.
Контракт рефакторинга раздела «Состояние обхода»: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения; синтаксис generic for сам этих гарантий не даёт.
Контракт рефакторинга раздела «Состояние обхода»: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.
Контракт рефакторинга раздела «Состояние обхода»: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Вопрос 11 из 20
На каком правиле держится поведение этого кода? Выберите основное правило раздела «Итератор с явным состоянием».
Lua Lua · Итератор с явным состоянием · разбор 1 Копировать
local function next_even(t, k)
local nk, v = next(t, k)
while nk and v % 2 ~= 0 do nk, v = next(t, nk) end
return nk, v
end
for k,v in next_even,{a=1,b=2,c=4},nil do print(k,v) end
Центральный механизм раздела «Итератор с явным состоянием»: Первое возвращённое значение становится новым управляющим и nil завершает цикл.
Центральный механизм раздела «Итератор с явным состоянием»: Синтаксис generic for сам этих гарантий не даёт.
Центральный механизм раздела «Итератор с явным состоянием»: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной.
Центральный механизм раздела «Итератор с явным состоянием»: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Центральный механизм раздела «Итератор с явным состоянием»: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs.
Вопрос 12 из 20
Какое наблюдение нужно зафиксировать при повторном вызове? Выберите именно проверяемую границу раздела «Итератор с явным состоянием».
Lua Lua · Итератор с явным состоянием · разбор 2 Копировать
local function reproduce_case()
local function next_even(t, k)
local nk, v = next(t, k)
while nk and v % 2 ~= 0 do nk, v = next(t, nk) end
return nk, v
end
for k,v in next_even,{a=1,b=2,c=4},nil do print(k,v) end
end
reproduce_case()
Отрицательный сценарий для раздела «Итератор с явным состоянием» фиксирует: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения; синтаксис generic for сам этих гарантий не даёт.
Отрицательный сценарий для раздела «Итератор с явным состоянием» фиксирует: Состояние итератора можно хранить в замыкании, но тогда каждый созданный итератор должен иметь собственные захваченные данные, иначе параллельные обходы вмешиваются друг в друга.
Отрицательный сценарий для раздела «Итератор с явным состоянием» фиксирует: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Отрицательный сценарий для раздела «Итератор с явным состоянием» фиксирует: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной; первое возвращённое значение становится новым управляющим и nil завершает цикл.
Отрицательный сценарий для раздела «Итератор с явным состоянием» фиксирует: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.
Вопрос 16 из 20
Какое правило точнее всего описывает происходящее в строке «for i,v in reverse({"a","b","c"}) do print(i,v) end»? Ответ должен описывать основной механизм раздела «Пользовательский обход».
Lua Lua · Пользовательский обход · разбор 1 Копировать
local function reverse(t)
local i = #t + 1
return function()
i = i - 1
if i > 0 then return i, t[i] end
end
end
for i,v in reverse({"a","b","c"}) do print(i,v) end
Результат кода в разделе «Пользовательский обход» объясняет утверждение: Первое возвращённое значение становится новым управляющим и nil завершает цикл.
Результат кода в разделе «Пользовательский обход» объясняет утверждение: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.
Результат кода в разделе «Пользовательский обход» объясняет утверждение: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной.
Результат кода в разделе «Пользовательский обход» объясняет утверждение: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs.
Результат кода в разделе «Пользовательский обход» объясняет утверждение: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения.
Вопрос 17 из 20
Что здесь важнее проверить, чем само отсутствие ошибки? Ищется граничное следствие правила из раздела «Пользовательский обход».
Lua Lua · Пользовательский обход · разбор 2 Копировать
local function reproduce_case()
local function reverse(t)
local i = #t + 1
return function()
i = i - 1
if i > 0 then return i, t[i] end
end
end
for i,v in reverse({"a","b","c"}) do print(i,v) end
end
reproduce_case()
Второй запуск раздела «Пользовательский обход» нужен, чтобы увидеть: Состояние итератора можно хранить в замыкании, но тогда каждый созданный итератор должен иметь собственные захваченные данные, иначе параллельные обходы вмешиваются друг в друга.
Второй запуск раздела «Пользовательский обход» нужен, чтобы увидеть: Пользовательский итератор должен явно задавать порядок, реакцию на изменение источника и возвращаемые значения; синтаксис generic for сам этих гарантий не даёт.
Второй запуск раздела «Пользовательский обход» нужен, чтобы увидеть: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной.
Второй запуск раздела «Пользовательский обход» нужен, чтобы увидеть: Generic for вызывает итератор с неизменным состоянием и текущей управляющей переменной; первое возвращённое значение становится новым управляющим и nil завершает цикл.
Второй запуск раздела «Пользовательский обход» нужен, чтобы увидеть: Stateless-итератор получает состояние и управляющее значение явно, как next в pairs; это облегчает повторный обход и не требует отдельного замыкания на каждый цикл.