💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 55 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 7 из 20
Что следует изменить во входе, чтобы проверить скрытое ограничение? Нужен отрицательный сценарий для раздела «Арифметические методы».
Lua Lua · Арифметические методы · разбор 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()
Второй запуск раздела «Арифметические методы» нужен, чтобы увидеть: Арифметические metamethods вызываются, когда обычная операция неприменима; они должны возвращать новое согласованное значение и не обязаны изменять левый операнд.
Второй запуск раздела «Арифметические методы» нужен, чтобы увидеть: Таблица в __index продолжает поиск по цепочке, а функция получает исходный объект и запрошенный ключ.
Второй запуск раздела «Арифметические методы» нужен, чтобы увидеть: __eq применяется только при подходящих метатаблицах и не управляет raw equality; для < и <= действуют отдельные методы и правила совместимости версий.
Второй запуск раздела «Арифметические методы» нужен, чтобы увидеть: __index используется только при отсутствии обычного ключа; таблица в __index продолжает поиск по цепочке, а функция получает исходный объект и запрошенный ключ.
Второй запуск раздела «Арифметические методы» нужен, чтобы увидеть: Поле __metatable скрывает настоящую метатаблицу от getmetatable и запрещает setmetatable, но не превращает объект в полностью неизменяемый и не защищает от debug library.
Вопрос 11 из 20
Какое правило точнее всего описывает происходящее в строке «local a,b=setmetatable({id=1},mt),setmetatable({id=1},mt)»? Выберите основное правило раздела «Сравнение».
Lua Lua · Сравнение · разбор 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))
Для этого кода в разделе «Сравнение» нужно учитывать: __eq применяется только при подходящих метатаблицах и не управляет raw equality; для < и <= действуют отдельные методы и правила совместимости версий.
Для этого кода в разделе «Сравнение» нужно учитывать: Таблица в __index продолжает поиск по цепочке, а функция получает исходный объект и запрошенный ключ.
Для этого кода в разделе «Сравнение» нужно учитывать: __index используется только при отсутствии обычного ключа; таблица в __index продолжает поиск по цепочке, а функция получает исходный объект и запрошенный ключ.
Для этого кода в разделе «Сравнение» нужно учитывать: Поле __metatable скрывает настоящую метатаблицу от getmetatable и запрещает setmetatable, но не превращает объект в полностью неизменяемый и не защищает от debug library.
Для этого кода в разделе «Сравнение» нужно учитывать: Арифметические metamethods вызываются, когда обычная операция неприменима; они должны возвращать новое согласованное значение и не обязаны изменять левый операнд.
Вопрос 12 из 20
Какой риск останется незамеченным, если выполнить код только один раз? Нужен отрицательный сценарий для раздела «Сравнение».
Lua Lua · Сравнение · разбор 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()
Для раздела «Сравнение» отдельным тестом подтверждают: Арифметические metamethods вызываются, когда обычная операция неприменима; они должны возвращать новое согласованное значение и не обязаны изменять левый операнд.
Для раздела «Сравнение» отдельным тестом подтверждают: Поле __metatable скрывает настоящую метатаблицу от getmetatable и запрещает setmetatable, но не превращает объект в полностью неизменяемый и не защищает от debug library.
Для раздела «Сравнение» отдельным тестом подтверждают: Таблица в __index продолжает поиск по цепочке, а функция получает исходный объект и запрошенный ключ.
Для раздела «Сравнение» отдельным тестом подтверждают: __index используется только при отсутствии обычного ключа; таблица в __index продолжает поиск по цепочке, а функция получает исходный объект и запрошенный ключ.
Для раздела «Сравнение» отдельным тестом подтверждают: __eq применяется только при подходящих метатаблицах и не управляет raw equality; для < и <= действуют отдельные методы и правила совместимости версий.