Menu
Coddy logo textTech

Точка против двоеточия

Часть раздела Объектно-ориентированное программирование путешествия по 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, и используйте точку, когда она не требуется.

challenge icon

Задание

Легко

Создайте таблицу с именем player с полем score, инициализированным значением 0.

Добавьте в таблицу две функции:

  1. player.setScore(self, value) — определенную с использованием точечного синтаксиса и явным параметром self. Устанавливает self.score в заданное значение.
  2. player:addBonus(amount) — определенную с использованием двоеточия. Добавляет amount к self.score.

Вы получите два входных значения:

  1. Начальное значение счета
  2. Сумма бонуса для добавления

Выполните следующие шаги:

  1. Вызовите setScore, используя точечный синтаксис (передав таблицу в качестве первого аргумента), чтобы установить начальный счет
  2. Вызовите addBonus, используя синтаксис с двоеточием, чтобы добавить бонус
  3. Выведите конечное значение 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)
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование