Точка против двоеточия
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 4 из 70.
Теперь, когда вы знаете и dot, и colon syntax, крайне важно понять, когда использовать каждый из них и что происходит, если неправильно их смешать.
Ключевое правило простое: то, как вы определяете function, должно соответствовать тому, как вы её вызываете. Если вы определяете её с помощью colon, используйте call с помощью colon. Если вы определяете её с помощью dot и explicit self, используйте call с помощью dot и передайте table.
Вот что происходит, когда вы неправильно сопоставляете их:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- WRONG: вызов через точку, но таблица не передана
game.addPoints(10) -- Ошибка! self теперь 10, а не таблицаКогда вы вызываете game.addPoints(10), Lua не передаёт автоматически game. Значение 10 становится self, вызывая непредвиденное поведение или ошибки.
Обратное направление более снисходительно:
function game.reset(self)
self.score = 0
end
-- Вызов с двоеточием: game:reset() — то же самое, что game.reset(game)
game:reset() -- self корректно получает game, поэтому это работаетХотя в данном конкретном случае это может работать, такой подход создаёт путаницу и может нарушить работу функций, которые ожидают определённые argument. Самый безопасный подход — быть последовательным: использовать colon и при определении, и при вызове, когда функции нужен self, и использовать dot, когда он не нужен.
Задание
ЛегкоCreate таблицу с именем player с полем score, initialized значением 0.
Add две функции в таблицу:
player.setScore(self, value)— определённая с использованием dot syntax и явного параметраself. Устанавливаетself.scoreв указанное значение.player:addBonus(amount)— определённая с использованием colon syntax. Add значениеamountкself.score.
Вы получите два входных значения:
- начальное значение score
- значение бонуса для добавления
Выполните следующие шаги:
- Call
setScoreusing dot syntax (передав table в качестве first аргумента), чтобы установить начальное значение score - Call
addBonususing colon syntax, чтобы добавить бонус - Выведите final значение
player.score
Помните: способ вызова каждой функции должен соответствовать тому, как она была определена.
REQUIRED OUTPUT FORMAT:Попробуйте сами
-- Прочитать ввод
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: Напишите ваш код ниже
-- 1. Создайте таблицу с именем 'player' с полем 'score', инициализированным значением 0
-- 2. Добавьте player.setScore(self, value), используя точечный синтаксис с явным self
-- 3. Добавьте player:addBonus(amount), используя синтаксис с двоеточием
-- 4. Вызовите setScore, используя точечный синтаксис (передавая таблицу первым аргументом)
-- 5. Вызовите addBonus, используя синтаксис с двоеточием
-- Вывести итоговый счёт
print(player.score)В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua