💡 Инструкция: Выберите один ответ из пяти. Время — 55 минут. У каждого задания ровно один правильный вариант. Фрагменты рассчитаны на Ruby 4.0.6; задания Rails — на Rails 8.1.3. После завершения откроются общий процент, 4 тематических результатов и разбор всех ответов.
Вопрос 1 из 20
Что произойдёт после последней строки в примере по теме «Подключение методов через include»? Проверьте обе половины ответа: частично верный вариант остаётся неверным.
Ruby Ruby — Подключение методов через include Копировать
# Проследите выполнение и выберите точный результат.
module Labels
def label
'item'
end
end
class Formatter
include Labels
end
p Formatter.ancestors
p Formatter.new.label
Экземпляр Formatter вызывает `label` из модуля Labels и получает строку `item`. Это объясняется тем, что `include` добавляет методы модуля как методы экземпляров класса, помещая модуль в цепочку предков после самого класса.
Экземпляр Formatter вызывает `label` из модуля Labels и получает строку `item`. Это объясняется тем, что `extend mod` добавляет методы модуля как singleton-методы конкретного объекта, а не всем экземплярам его класса.
Экземпляр Formatter вызывает `label` из модуля Labels и получает строку `item`. Это объясняется тем, что вложенная константа ищется по лексическому и предковому контексту; полное имя `Billing::Invoice` устраняет неоднозначность пространства имён.
Только объект `service` отвечает на `healthy?`; другой Object без extend такого метода не получает. Это объясняется тем, что `include` добавляет методы модуля как методы экземпляров класса, помещая модуль в цепочку предков после самого класса.
Вызов возвращает `logged(saved)`: сначала срабатывает модуль Audit, затем через super метод класса. Это объясняется тем, что `include` добавляет методы модуля как методы экземпляров класса, помещая модуль в цепочку предков после самого класса.
Вопрос 2 из 20
Не запуская пример, выберите точный итог для блока «Обёртка методов через prepend». Выберите связку, в которой верны и основной вывод, и его обоснование.
Ruby Ruby — Обёртка методов через prepend Копировать
# Проследите выполнение и выберите точный результат.
module Audit
def save(*)
"logged(#{super})"
end
end
class Record
prepend Audit
def save
'saved'
end
end
p Record.new.save
Вызов возвращает `logged(saved)`: сначала срабатывает модуль Audit, затем через super метод класса. Причина такого результата: вложенная константа ищется по лексическому и предковому контексту; полное имя `Billing::Invoice` устраняет неоднозначность пространства имён.
Вызов возвращает `logged(saved)`: сначала срабатывает модуль Audit, затем через super метод класса. Причина такого результата: `include` добавляет методы модуля как методы экземпляров класса, помещая модуль в цепочку предков после самого класса.
Внутри `Billing::Invoice#currency` константа разрешается как `Billing::CURRENCY` и возвращает `EUR`. Причина такого результата: `prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`.
Только объект `service` отвечает на `healthy?`; другой Object без extend такого метода не получает. Причина такого результата: `prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`.
Вызов возвращает `logged(saved)`: сначала срабатывает модуль Audit, затем через super метод класса. Причина такого результата: `prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`.
Вопрос 6 из 20
Что в реализации по теме «Обёртка методов через prepend» требует исправления прежде всего? Нужен вариант без логического разрыва между первой и второй частью.
Ruby Ruby — Обёртка методов через prepend Копировать
# Обычный запуск проходит. Найдите скрытый риск.
module Audit
def save(*)
"logged(#{super})"
end
end
class Record
prepend Audit
def save
'saved'
end
end
p Record.new.save
Два подключённых модуля с одинаковым методом делают результат зависимым от порядка include, если класс не разрешает конфликт явно. Этот риск связан с тем, что `prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`.
Модуль-обёртка с неверной сигнатурой ломает ключевые аргументы или блок, хотя исходный метод их поддерживал. Этот риск связан с тем, что `prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`.
Модуль-обёртка с неверной сигнатурой ломает ключевые аргументы или блок, хотя исходный метод их поддерживал. Этот риск связан с тем, что `include` добавляет методы модуля как методы экземпляров класса, помещая модуль в цепочку предков после самого класса.
Расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса. Этот риск связан с тем, что `prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`.
Модуль-обёртка с неверной сигнатурой ломает ключевые аргументы или блок, хотя исходный метод их поддерживал. Этот риск связан с тем, что вложенная константа ищется по лексическому и предковому контексту; полное имя `Billing::Invoice` устраняет неоднозначность пространства имён.
Вопрос 7 из 20
Что в реализации по теме «Расширение объекта через extend» требует исправления прежде всего? Одного совпавшего вывода недостаточно — проверьте также вторую часть ответа.
Ruby Ruby — Расширение объекта через extend Копировать
# Обычный запуск проходит. Найдите скрытый риск.
module Health
def healthy?
true
end
end
service = Object.new
service.extend(Health)
p [service.healthy?, Object.new.respond_to?(:healthy?)]
Расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса. Уязвимое место возникает потому, что вложенная константа ищется по лексическому и предковому контексту; полное имя `Billing::Invoice` устраняет неоднозначность пространства имён.
Два подключённых модуля с одинаковым методом делают результат зависимым от порядка include, если класс не разрешает конфликт явно. Уязвимое место возникает потому, что `extend mod` добавляет методы модуля как singleton-методы конкретного объекта, а не всем экземплярам его класса.
Расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса. Уязвимое место возникает потому, что `extend mod` добавляет методы модуля как singleton-методы конкретного объекта, а не всем экземплярам его класса.
Модуль-обёртка с неверной сигнатурой ломает ключевые аргументы или блок, хотя исходный метод их поддерживал. Уязвимое место возникает потому, что `extend mod` добавляет методы модуля как singleton-методы конкретного объекта, а не всем экземплярам его класса.
Расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса. Уязвимое место возникает потому, что `include` добавляет методы модуля как методы экземпляров класса, помещая модуль в цепочку предков после самого класса.
Вопрос 10 из 20
Как сформулировать правило блока «Обёртка методов через prepend» без лишних обещаний? Ищите не знакомые слова, а технически непротиворечивую пару утверждений.
`include` добавляет методы модуля как методы экземпляров класса, помещая модуль в цепочку предков после самого класса. Из этого следует, что вызов возвращает `logged(saved)`: сначала срабатывает модуль Audit, затем через super метод класса.
`prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`. Из этого следует, что вызов возвращает `logged(saved)`: сначала срабатывает модуль Audit, затем через super метод класса.
Вложенная константа ищется по лексическому и предковому контексту; полное имя `Billing::Invoice` устраняет неоднозначность пространства имён. Из этого следует, что вызов возвращает `logged(saved)`: сначала срабатывает модуль Audit, затем через super метод класса.
`prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`. Из этого следует, что внутри `Billing::Invoice#currency` константа разрешается как `Billing::CURRENCY` и возвращает `EUR`.
`prepend` помещает модуль перед классом в цепочке поиска, поэтому модуль может обернуть метод класса и вызвать исходную реализацию через `super`. Из этого следует, что только объект `service` отвечает на `healthy?`; другой Object без extend такого метода не получает.
Вопрос 13 из 20
Какой вариант правки выдержит граничный сценарий темы «Подключение методов через include»? Правильным считается только полностью согласованное утверждение.
Ruby Ruby — Подключение методов через include Копировать
# Выберите изменение, которое исправляет причину.
module Labels
def label
'item'
end
end
class Formatter
include Labels
end
p Formatter.ancestors
p Formatter.new.label
При пересечении имён определить метод в классе или создать более узкие модули, чтобы порядок подключения не был скрытым решением. Так закрывается риск: два подключённых модуля с одинаковым методом делают результат зависимым от порядка include, если класс не разрешает конфликт явно.
При пересечении имён определить метод в классе или создать более узкие модули, чтобы порядок подключения не был скрытым решением. Так закрывается риск: модуль-обёртка с неверной сигнатурой ломает ключевые аргументы или блок, хотя исходный метод их поддерживал.
При пересечении имён определить метод в классе или создать более узкие модули, чтобы порядок подключения не был скрытым решением. Так закрывается риск: расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса.
Для общего поведения объявить его на классе или фабрике; extend экземпляра применять как локальное, явно документированное украшение. Так закрывается риск: два подключённых модуля с одинаковым методом делают результат зависимым от порядка include, если класс не разрешает конфликт явно.
В обёртке прозрачно передавать позиционные и ключевые аргументы с блоком и иметь тест контракта на обе реализации. Так закрывается риск: два подключённых модуля с одинаковым методом делают результат зависимым от порядка include, если класс не разрешает конфликт явно.
Вопрос 15 из 20
Какой рефакторинг переводит правило «Расширение объекта через extend» из договорённости в проверяемый контракт? Не выбирайте ответ по одному точному фрагменту: вся формулировка должна выдерживать проверку.
Для общего поведения объявить его на классе или фабрике; extend экземпляра применять как локальное, явно документированное украшение. Такая правка нужна из-за риска: расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса.
Для внешних зависимостей и неоднозначных имён использовать полные пути констант, а автозагрузку проверять в том же режиме, что и рабочее приложение. Такая правка нужна из-за риска: расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса.
Для общего поведения объявить его на классе или фабрике; extend экземпляра применять как локальное, явно документированное украшение. Такая правка нужна из-за риска: два подключённых модуля с одинаковым методом делают результат зависимым от порядка include, если класс не разрешает конфликт явно.
Для общего поведения объявить его на классе или фабрике; extend экземпляра применять как локальное, явно документированное украшение. Такая правка нужна из-за риска: модуль-обёртка с неверной сигнатурой ломает ключевые аргументы или блок, хотя исходный метод их поддерживал.
При пересечении имён определить метод в классе или создать более узкие модули, чтобы порядок подключения не был скрытым решением. Такая правка нужна из-за риска: расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса.
Вопрос 16 из 20
Какое инженерное решение лучше всего соответствует механизму «Пространства имён»? В правильном ответе вторая часть действительно объясняет или проверяет первую.
При пересечении имён определить метод в классе или создать более узкие модули, чтобы порядок подключения не был скрытым решением. Решение адресует следующий дефект: определение класса через `class Billing::Invoice` и через лексически вложенные `module Billing; class Invoice` может дать разный поиск неполных констант.
Для общего поведения объявить его на классе или фабрике; extend экземпляра применять как локальное, явно документированное украшение. Решение адресует следующий дефект: определение класса через `class Billing::Invoice` и через лексически вложенные `module Billing; class Invoice` может дать разный поиск неполных констант.
Для внешних зависимостей и неоднозначных имён использовать полные пути констант, а автозагрузку проверять в том же режиме, что и рабочее приложение. Решение адресует следующий дефект: два подключённых модуля с одинаковым методом делают результат зависимым от порядка include, если класс не разрешает конфликт явно.
Для внешних зависимостей и неоднозначных имён использовать полные пути констант, а автозагрузку проверять в том же режиме, что и рабочее приложение. Решение адресует следующий дефект: определение класса через `class Billing::Invoice` и через лексически вложенные `module Billing; class Invoice` может дать разный поиск неполных констант.
Для внешних зависимостей и неоднозначных имён использовать полные пути констант, а автозагрузку проверять в том же режиме, что и рабочее приложение. Решение адресует следующий дефект: расширение одного экземпляра легко теряется после сериализации, копирования или создания нового объекта того же класса.