Точка против двоеточия
Часть раздела Object Oriented Programming путешествия по 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 дважды
game:reset() -- self получает game, но также ожидается дополнительный аргумент nilХотя этот конкретный случай может сработать, это создает путаницу и может нарушить работу функций, ожидающих определенные аргументы. Самый безопасный подход — придерживаться единообразия: используйте двоеточие как при определении, так и при вызове, когда функции требуется self, и используйте точку, когда она не требуется.
Задание
ЛегкоСоздайте таблицу с именем player с полем score, инициализированным значением 0.
Добавьте в таблицу две функции:
player.setScore(self, value)— определенную с использованием точечного синтаксиса и явным параметромself. Устанавливаетself.scoreв заданное значение.player:addBonus(amount)— определенную с использованием двоеточия. Добавляетamountкself.score.
Вы получите два входных значения:
- Начальное значение счета
- Сумма бонуса для добавления
Выполните следующие шаги:
- Вызовите
setScore, используя точечный синтаксис (передавая таблицу в качестве первого аргумента), чтобы установить начальный счет - Вызовите
addBonus, используя синтаксис с двоеточием, чтобы добавить бонус - Выведите конечное значение
player.score
Помните: способ вызова каждой функции должен соответствовать тому, как она была определена.
Шпаргалка
При определении и вызове методов в Lua синтаксис должен совпадать:
- Если вы определяете через двоеточие (
:), вызывайте через двоеточие - Если вы определяете через точку (
.) с явнымself, вызывайте через точку и передавайте таблицу
Неправильное использование — вызов через точку при определении через двоеточие:
function game:addPoints(points)
self.score = self.score + points
end
game.addPoints(10) -- Ошибка! self становится равен 10, а не таблицеНеправильное использование — вызов через двоеточие при определении через точку:
function game.reset(self)
self.score = 0
end
game:reset() -- Сбивает с толку: передает game автоматически, но может вызвать проблемыПравильное использование — соответствие синтаксиса:
-- Определение через двоеточие, вызов через двоеточие
function game:addPoints(points)
self.score = self.score + points
end
game:addPoints(10)
-- Определение через точку, вызов через точку
function game.reset(self)
self.score = 0
end
game.reset(game)Попробуйте сами
-- Чтение входных данных
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)В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур