Точка против двоеточия
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 4 из 70.
Теперь, когда ты знаешь синтаксис с точкой и двоеточием, разберём, как они связаны и что происходит, если таблица не передаётся.
Оба двоеточия — это сокращённая запись. Определение function game:addPoints(points) эквивалентно определению function game.addPoints(self, points), а вызов game:addPoints(10) эквивалентен вызову game.addPoints(game, 10). Метод работает, если таблица передаётся ему первым аргументом.
Вот что происходит, когда таблица не передана:
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, и self.score не работает, потому что 10 — это число, а не таблица.
Функция, определённая с точкой и явным параметром self, работает при вызове через двоеточие, потому что двоеточие передаёт таблицу в качестве первого аргумента:
function game.reset(self)
self.score = 0
end
-- Вызов через двоеточие: game:reset() — то же самое, что game.reset(game)
game:reset() -- self получает game, как и должно быть, поэтому это работаетОба определения создают одну и ту же функцию, поэтому выбор зависит от принятого соглашения: используй двоеточие для определения и вызова функций, работающих с self, а точку — для функций, которые не используют 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Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua