Menu
CoddyTech

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

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

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

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

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

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