【发布时间】:2014-01-13 00:52:53
【问题描述】:
我正在构建一个简单的游戏,并且一直在关注 PIL 书。这是我的游戏基于的场景: http://www.lua.org/pil/16.1.html
我很苦恼,因为书中只有一个模块,而我试图让 8 个模块一起工作。
这是我游戏的一小部分:我现在有一个游戏模块、一个棋盘模块和一个输入/输出模块。
我以为我了解何时使用冒号以及何时使用句号,但我不明白为什么在 PIL 示例中,作者将“o”传递给“新”方法以及为什么有一个冒号用那个方法?
我的游戏模块应该是我的最高级别模块。在其中,我想我会更新电路板和输入/输出模块并让它们一起工作。但是对于板卡和输入/输出模块来说,这些“新”(即初始化)方法是什么样的呢?
这是我一直在使用的一些代码(简化):
Game = {}
function Game:new(o)
o = {} or o
setmetatable(o, self)
self.__index = self
-- need board and input_output instances below
o.board = Board:new(o)
o.input_output = Input_Output:new(o)
return o
end
return Game
----------------------------------------------------
Board = {}
function Board:new(o)
o = o or {}
-- need layout attribute here
o.layout = { create_layout() }
setmetatable(o, self)
self.__index = self
return o
end
return Board
---------------------------------------------------
Input_Output = {}
function Input_Output:new(o)
o = o or {}
-- need read and write attributes here
o.read = stdin
o.write = stdout
setmetatable(o, self)
self.__index = self
return o
end
return Input_Output
在像 Ruby 这样的 OOP 语言中,Game 将保存我的 Board 和 Input_Output 类的实例。然后,如果我深入到 game.board,我可以看到板上的公共属性和公共方法。
但是,当我在游戏中更新这两个“职业”时,发生了一些奇怪的事情。我的 self 和 o 变量不是我所期望的(我正在使用 lua_inspect)。我似乎可能会用模块的每个新实例覆盖 o 变量中的数据?
我很迷茫,我认为这是因为“新”方法。我就是不明白。
谁能解释一下?我的问题主要是 - 示例中的“o”是什么,为什么“新”方法上有一个冒号?
【问题讨论】:
-
附带说明一下,有很多面向对象的实现(例如yonaba.github.io/30log)。您可以使用它们而不是自己管理元表。