Menu
Coddy logo textTech

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

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

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

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

Шпаргалка

При определении и вызове методов в 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)
quiz iconПроверьте себя

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

Все уроки раздела Object Oriented Programming