Синтаксис с двоеточием
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 3 из 70.
Писать counter.increment(counter) каждый раз утомительно и чревато ошибками. Lua предоставляет более элегантный способ: оператор двоеточия (:).
Когда вы определяете функцию с использованием двоеточия, Lua автоматически добавляет self в качестве первого параметра:
local player = {
name = "Hero"
}
-- Использование двоеточия в определении
function player:greet()
print("Hello, I am " .. self.name)
endДвоеточие также работает при вызове функции. Оно автоматически передает таблицу в качестве первого аргумента:
player:greet() -- Вывод: Hello, I am HeroЭто эквивалентно записи player.greet(player), но гораздо чище. Двоеточие обрабатывает параметр self с обеих сторон — при определении и при вызове.
Вот сравнение, показывающее, что оба подхода дают одинаковые результаты:
local counter = { value = 0 }
-- Точечный синтаксис (явный self)
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
-- Синтаксис с двоеточием (автоматический self)
function counter:decrement()
self.value = self.value - 1
end
counter:decrement()Синтаксис с двоеточием — это стандартный способ определения и вызова методов в Lua. Это делает ваш код короче и менее повторяющимся.
Задание
ЛегкоСоздайте таблицу с именем greeter с полем message, инициализированным значением, которое вы получите на вход.
Добавьте метод :sayHello(name), используя синтаксис с двоеточием, который выводит приветствие в следующем формате:
[message], [name]!Вы получите два входных значения:
- Приветственное сообщение для сохранения в
greeter.message - Имя для передачи в метод
:sayHello()
Определите метод, используя синтаксис с двоеточием, и вызовите его, используя синтаксис с двоеточием. Выведите отформатированное приветствие.
Например, если сообщение — Welcome, а имя — Luna, результат должен быть:
Welcome, Luna!Шпаргалка
Оператор двоеточия (:) обеспечивает более чистый синтаксис для определения и вызова методов в Lua, автоматически обрабатывая параметр self.
При определении функции с использованием двоеточия self автоматически добавляется в качестве первого параметра:
function player:greet()
print("Hello, I am " .. self.name)
endПри вызове функции через двоеточие таблица автоматически передается в качестве первого аргумента:
player:greet() -- Эквивалентно player.greet(player)Сравнение синтаксиса с точкой и синтаксиса с двоеточием:
-- Синтаксис с точкой (явный self)
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
-- Синтаксис с двоеточием (автоматический self)
function counter:decrement()
self.value = self.value - 1
end
counter:decrement()Синтаксис с двоеточием является стандартным способом определения и вызова методов в Lua, что делает код короче и менее повторяющимся.
Попробуйте сами
-- Чтение ввода
local message = io.read()
local name = io.read()
-- TODO: Напишите ваш код ниже
-- 1. Создайте таблицу с именем 'greeter' и полем 'message'
-- 2. Добавьте метод :sayHello(name), используя синтаксис с двоеточием
-- 3. Вызовите метод, используя синтаксис с двоеточием, чтобы вывести приветствиеВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур