ООП Справка - Как я могу получить этот блок кода для распознавания одного из его аргументов? - PullRequest
2 голосов
/ 05 июня 2019

Я изучаю Lua и как реализовать ООП.Испытание тестового примера объекта, по-видимому, возвращает один из аргументов объекта как «ноль», несмотря на то, что ему присвоено значение.

function Character(Name, Level, Class)   --Constructor
    return {GetName = T.GetName, GetLevel = T.GetLevel, GetClass = T.GetClass}
  end
end
-- Snippets
Player = Character("Bob", 1, "Novice")

Когда я пытаюсь напечатать Player.GetName () он возвращает ноль вместо Боб .Где я ошибся?

Вот полный код .

1 Ответ

1 голос
/ 06 июня 2019

ООП в Lua занимает немного больше, чем то, что вы там делали, вы захотите использовать метатаблицы и значения.

-- How you could define your character structure.
local Character = {}

function Character.GetName(self)
  return self.name
end

function Character.new(Name, Level, Class)
  local _meta = {}
  local _private = {}
  _private.name = Name
  _private.level = Level
  _private.class = Class

  _meta.__index = function(t, k) -- This allows access to _private
    return rawget(_private, k) or rawget(Character, k)
  end

  _meta.__newindex = function(t, k, v) -- This prevents the value from being shaded
    if rawget(_private, k) or rawget(Character, k) then
      error("this field is protected")
    else 
      rawset(t, k, v)
    end
  end
  return  setmetatable({}, _meta) --return an empty table with our meta methods implemented 
end

Это создает локальную таблицу _private при создании нового экземпляра Character.Эта локальная таблица является повышением до _meta.__index, и к ней нельзя получить доступ за пределами функции Character.new.Доступ к _private возможен, когда вызывается __index, потому что это повышенное значение.

-- How to use the character structure 
player = Character.new("Bob", 10, "Novice")
npc = Character.new("Alice", 11, "Novice")
print(player:GetName())

Я использую player:GetName(), но, честно говоря, вы также можете просто набрать player.name.

Ресурсы для дополнительной информации по этой теме:

http://tutorialspoint.com/lua/lua_metatables.htm

http://lua -users.org / wiki / ObjectOrientationTutorial

...