Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 4 из 70.

Теперь, когда вы знаете и dot, и colon syntax, крайне важно понять, когда использовать каждый из них и что происходит, если неправильно их смешать.

Ключевое правило простое: то, как вы определяете function, должно соответствовать тому, как вы её вызываете. Если вы определяете её с помощью colon, используйте call с помощью colon. Если вы определяете её с помощью dot и explicit self, используйте call с помощью dot и передайте table.

Вот что происходит, когда вы неправильно сопоставляете их:

local game = { score = 0 }

function game:addPoints(points)
    self.score = self.score + points
end

-- WRONG: вызов через точку, но таблица не передана
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, поэтому это работает

Хотя в данном конкретном случае это может работать, такой подход создаёт путаницу и может нарушить работу функций, которые ожидают определённые argument. Самый безопасный подход — быть последовательным: использовать colon и при определении, и при вызове, когда функции нужен self, и использовать dot, когда он не нужен.

challenge icon

Задание

Легко

Create таблицу с именем player с полем score, initialized значением 0.

Add две функции в таблицу:

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

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

  1. начальное значение score
  2. значение бонуса для добавления

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

  1. Call setScore using dot syntax (передав table в качестве first аргумента), чтобы установить начальное значение score
  2. Call addBonus using colon syntax, чтобы добавить бонус
  3. Выведите final значение player.score

Помните: способ вызова каждой функции должен соответствовать тому, как она была определена.

REQUIRED OUTPUT FORMAT: [Your translated content here]

Попробуйте сами

-- Прочитать ввод
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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Lua