LU Lua  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Метатаблицы и metamethods

Тест по теме «Метатаблицы и metamethods» проверяет чтение кода, поиск скрытых допущений и выбор решения для обычных и граничных сценариев. В нём 20 вопросов, из них 10 содержат фрагменты Lua. Условия отдельно отмечают случаи, зависящие от версии языка или внешней библиотеки.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 55 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 20
Какое правило останется верным на другом входе этого же фрагмента? Нужна именно центральная гарантия раздела «Поиск через __index».
LuaLua · Поиск через __index · разбор 1
local defaults = {timeout=5}
local cfg = setmetatable({host="db"}, {__index=defaults})
print(cfg.host, cfg.timeout, rawget(cfg,"timeout"))
Вопрос 2 из 20
Что не видно по одному успешному запуску этого кода? Ищется граничное следствие правила из раздела «Поиск через __index».
LuaLua · Поиск через __index · разбор 2
local function reproduce_case()
  local defaults = {timeout=5}
  local cfg = setmetatable({host="db"}, {__index=defaults})
  print(cfg.host, cfg.timeout, rawget(cfg,"timeout"))
end
reproduce_case()
Вопрос 3 из 20
Какой контракт отличит эквивалентный рефакторинг от тихой поломки? Нужен основной контракт раздела «Поиск через __index».
LuaLua · Поиск через __index · разбор 3
do
  local defaults = {timeout=5}
  local cfg = setmetatable({host="db"}, {__index=defaults})
  print(cfg.host, cfg.timeout, rawget(cfg,"timeout"))
end
Вопрос 4 из 20
Решение по разделу «Поиск через __index» должно пережить обновление зависимости. Что фиксировать в контракте? Нужна эксплуатационная граница раздела «Поиск через __index».
Вопрос 5 из 20
Что следует считать рабочим контрактом раздела «Поиск через __index»? Выберите описание, объединяющее механизм и границу раздела «Поиск через __index».
Вопрос 6 из 20
Какой контракт языка проявляется в этом примере? Нужна именно центральная гарантия раздела «Арифметические методы».
LuaLua · Арифметические методы · разбор 1
local Vec = {}
Vec.__index = Vec
function Vec.__add(a,b) return setmetatable({x=a.x+b.x}, Vec) end
local a,b=setmetatable({x=2},Vec),setmetatable({x=5},Vec)
print((a+b).x, a.x)
Вопрос 7 из 20
Что следует изменить во входе, чтобы проверить скрытое ограничение? Нужен отрицательный сценарий для раздела «Арифметические методы».
LuaLua · Арифметические методы · разбор 2
local function reproduce_case()
  local Vec = {}
  Vec.__index = Vec
  function Vec.__add(a,b) return setmetatable({x=a.x+b.x}, Vec) end
  local a,b=setmetatable({x=2},Vec),setmetatable({x=5},Vec)
  print((a+b).x, a.x)
end
reproduce_case()
Вопрос 8 из 20
Что нельзя считать деталью реализации в этом коде? Нужен основной контракт раздела «Арифметические методы».
LuaLua · Арифметические методы · разбор 3
do
  local Vec = {}
  Vec.__index = Vec
  function Vec.__add(a,b) return setmetatable({x=a.x+b.x}, Vec) end
  local a,b=setmetatable({x=2},Vec),setmetatable({x=5},Vec)
  print((a+b).x, a.x)
end
Вопрос 9 из 20
Какой принцип сделает реализацию «Арифметические методы» устойчивой, а не просто удачной на одном примере? Нужна эксплуатационная граница раздела «Арифметические методы».
Вопрос 10 из 20
Какой вариант точнее всего передаёт смысл раздела «Арифметические методы»? Выберите описание, объединяющее механизм и границу раздела «Арифметические методы».
Вопрос 11 из 20
Какое правило точнее всего описывает происходящее в строке «local a,b=setmetatable({id=1},mt),setmetatable({id=1},mt)»? Выберите основное правило раздела «Сравнение».
LuaLua · Сравнение · разбор 1
local mt = {__eq=function(a,b) return a.id==b.id end}
local a,b=setmetatable({id=1},mt),setmetatable({id=1},mt)
print(a==b, rawequal(a,b))
Вопрос 12 из 20
Какой риск останется незамеченным, если выполнить код только один раз? Нужен отрицательный сценарий для раздела «Сравнение».
LuaLua · Сравнение · разбор 2
local function reproduce_case()
  local mt = {__eq=function(a,b) return a.id==b.id end}
  local a,b=setmetatable({id=1},mt),setmetatable({id=1},mt)
  print(a==b, rawequal(a,b))
end
reproduce_case()
Вопрос 13 из 20
Какое требование стоит закрепить тестом до начала рефакторинга? Выберите гарантию, определяющую раздел «Сравнение».
Вопрос 14 из 20
Команда сокращает код в разделе «Сравнение». Как не потерять важное граничное поведение? Ответ должен выражать проверяемое следствие раздела «Сравнение».
Вопрос 15 из 20
Какое описание раздела «Сравнение» выдерживает и обычный, и граничный сценарий? Нужна полная формулировка раздела «Сравнение».
Вопрос 16 из 20
Какая семантическая деталь определяет поведение фрагмента? Нужна именно центральная гарантия раздела «Защита метатаблицы».
LuaLua · Защита метатаблицы · разбор 1
local mt = {__metatable="locked", __index={read=true}}
local t = setmetatable({}, mt)
print(getmetatable(t), t.read)
-- setmetatable(t, {}) -- ошибка
Вопрос 17 из 20
Какой риск останется незамеченным, если выполнить код только один раз? Нужен отрицательный сценарий для раздела «Защита метатаблицы».
LuaLua · Защита метатаблицы · разбор 2
local function reproduce_case()
  local mt = {__metatable="locked", __index={read=true}}
  local t = setmetatable({}, mt)
  print(getmetatable(t), t.read)
  -- setmetatable(t, {}) -- ошибка
end
reproduce_case()
Вопрос 18 из 20
Код переписывают без изменения внешнего поведения. Какой контракт должен сохраниться? Выберите гарантию, определяющую раздел «Защита метатаблицы».
Вопрос 19 из 20
Какое решение по разделу «Защита метатаблицы» упростит и проверку, и расследование сбоя? Выберите практическое следствие раздела «Защита метатаблицы».
Вопрос 20 из 20
Что в разделе «Защита метатаблицы» является гарантией, а не привычкой конкретного проекта? Выберите описание, объединяющее механизм и границу раздела «Защита метатаблицы».

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу