OOP 帮助 - 如何让此代码块识别其参数之一?
OOP Help - How do I get this code block to recognize one of its arguments?
我正在学习 Lua 以及如何实现 OOP。尝试一个对象的测试示例似乎 return 对象的参数之一为 'null' 尽管被分配了一个。
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() 时,它 returns null 而不是 Bob。我哪里做错了?
这里是the full code.
Lua 中的 OOP 比您在那里所做的要多一些,您将需要使用 metatables 和上值。
-- 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
这会在您创建 Character
的新实例时创建本地 table _private
。本地 table 是 _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
。
有关此主题的更多资源:
我正在学习 Lua 以及如何实现 OOP。尝试一个对象的测试示例似乎 return 对象的参数之一为 'null' 尽管被分配了一个。
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() 时,它 returns null 而不是 Bob。我哪里做错了?
这里是the full code.
Lua 中的 OOP 比您在那里所做的要多一些,您将需要使用 metatables 和上值。
-- 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
这会在您创建 Character
的新实例时创建本地 table _private
。本地 table 是 _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
。
有关此主题的更多资源: