Точка против двоеточия
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy — урок 4 из 70.
Теперь, когда вы знакомы с синтаксисом через точку и через двоеточие, важно понимать, когда использовать каждый из них — и что происходит, если их неправильно смешивать.
Основное правило простое: то, как вы определяете функцию, должно соответствовать тому, как вы её вызываете. Если вы определяете её через двоеточие, вызывайте через двоеточие. Если вы определяете её через точку и явный self, вызывайте через точку и передавайте таблицу.
Вот что происходит, когда они не совпадают:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- НЕПРАВИЛЬНО: вызов через точку, но таблица не передана
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, поэтому это работаетХотя этот конкретный случай может сработать, он создает путаницу и может нарушить работу функций, ожидающих определенные аргументы. Самый безопасный подход — придерживаться единообразия: используйте двоеточие как при определении, так и при вызове, когда функции требуется self, и используйте точку, когда она не требуется.
Задание
ЛегкоСоздайте таблицу с именем player с полем score, инициализированным значением 0.
Добавьте в таблицу две функции:
player.setScore(self, value)— определенную с использованием точечного синтаксиса и явным параметромself. Устанавливаетself.scoreв заданное значение.player:addBonus(amount)— определенную с использованием двоеточия. Добавляетamountкself.score.
Вы получите два входных значения:
- Начальное значение счета
- Сумма бонуса для добавления
Выполните следующие шаги:
- Вызовите
setScore, используя точечный синтаксис (передав таблицу в качестве первого аргумента), чтобы установить начальный счет - Вызовите
addBonus, используя синтаксис с двоеточием, чтобы добавить бонус - Выведите конечное значение
player.score
Помните: способ вызова каждой функции должен соответствовать тому, как она была определена.
Попробуйте сами
-- Чтение входных данных
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Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур