Проектная лаборатория
Собственный интерпретатор
Этап 74 · Классы
Методы экземпляров
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите поддержку методов экземпляров в свой интерпретатор Lox. Методы — это функции, определённые внутри класса, которые можно вызывать для экземпляров этого класса.
Ссылка на книгу
Код для этого этапа реализован в разделе 12.5: Методы классов.
Проверки
Тестирующая система выполнит серию проверок с файлами test.lox, содержащими определения и вызовы методов.
Например, если test.lox содержит следующее:
class Robot {
beep() {
print "Beep boop!";
}
}
var r2d2 = Robot();
r2d2.beep();
Robot().beep();Тестирующая система запустит вашу программу следующим образом:
$ ./your_program.sh run test.lox
Beep boop!
Beep boop!Тестирующая система выполнит несколько таких проверок с методами в разных контекстах, например:
Тестовый случай 1:
Входные данные:
{
class Foo {
returnSelf() {
return Foo;
}
}
print Foo().returnSelf(); // expect: Foo
}Ожидаемый вывод:
FooТестовый случай 2:
Входные данные:
class Wizard {
castSpell(spell) {
print "Casting a magical spell: " + spell;
}
}
class Dragon {
breatheFire(fire, intensity) {
print "Breathing " + fire + " with intensity: "
+ intensity;
}
}
// Methods on different class instances
var merlin = Wizard();
var smaug = Dragon();
// Conditional method calling
if (true) {
var action = merlin.castSpell;
action("Fireball");
} else {
var action = smaug.breatheFire;
action("Fire", "100");
}Ожидаемый вывод:
Casting a magical spell: FireballТестовый случай 3:
Входные данные:
class Superhero {
useSpecialPower(hero) {
print "Using power: " + hero.specialPower;
}
hasSpecialPower(hero) {
return hero.specialPower;
}
giveSpecialPower(hero, power) {
hero.specialPower = power;
}
}
// Methods in functions
fun performHeroics(hero, superheroClass) {
if (superheroClass.hasSpecialPower(hero)) {
superheroClass.useSpecialPower(hero);
} else {
print "No special power available";
}
}
var superman = Superhero();
var heroClass = Superhero();
if (true) {
heroClass.giveSpecialPower(superman, "Flight");
} else {
heroClass.giveSpecialPower(superman, "Strength");
}
performHeroics(superman, heroClass);Ожидаемый вывод:
Using power: FlightТестирующая система проверит, что ваша программа корректно обрабатывает методы, включая:
- Определение методов внутри классов.
- Вызов методов для экземпляров.
Примечания
- Этот формат вывода соответствует спецификации в репозитории книги
- Методы определяются внутри тела класса
- Методы могут принимать параметры и возвращать значения
- Методы могут использоваться для изменения свойств экземпляра
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init interpreter ./my-interpreter --language go2. Откройте папку в IDE
cd ./my-interpreterРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage qr2Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.