- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与我的示例平行的是,我正在构建一个游戏并有一个名为 player.lua 的类。
几周前我编写了这个代码,当时我还不太了解 Lua 的工作原理,所以我没有为播放器构建的表格。
我已经为玩家分配了各种属性,例如 self.speed 或 self.strength。我希望(而且确实有效)这些属性都属于玩家。
我有一些问题,但我似乎找不到合乎逻辑、直观的答案。
如果我在 player.lua 中声明了一个表 (player = {}),那么 player.speed 将引用玩家表的“speed”键。但如果没有这样一张 table ,我目前实际上在做什么?
如果我在 player.lua 中使用 player.speed 而不是 self.speed 会怎么样?
如果将来我想在同一个游戏中同时拥有多个玩家怎么办?我如何像在 Java 中那样“实例化同一类的多个实例”,但在 Lua 中?这是否基本上涉及拥有一个中央游戏 lua 文件,比如 main.lua 或 game.lua,然后构建一个玩家表,其中每个元素本身就是一个玩家表?
比如说,listofPlayers = {}你会去:table.insert(listOfPlayers, player:new()) where player:new() 会用玩家的所有默认属性实例化一个新表,然后返回该表?
那我什么时候使用元表呢?
最佳答案
元表用于重载语言中的常见操作。这些操作可以包括加法、乘法、相等比较和(顾名思义)类似表的操作,例如通过键 table[key]
访问值。
元表通常用于在 Lua 中实现面向对象编程。驱动它的主要机制是使用 __index
。这个例子将以最基本的形式说明这一点:
>>> parent = {parentID = 'Secret'}
>>> child = {}
>>> setmetatable(child,{__index=parent})
>>> =child.parentID
Secret
parentID
键实际上并不存在于 child 中,因此 child 中的无处有如下内容:
child = {
parentID = 'Secret'
}
相反,当有人查找 child
中不存在的 key 时,我们会去 parent
中查找,这是已设置的在我们分配给表的元表中:
>>> setmetatable(child,{__index=parent})
因此,当我们请求 child.parentID
时,以编程方式,事件流是:
child
是否包含键为 "parentID"
的键值对?否,因此转到 2。child
是否在其元表中定义了 __index
?是,转到 3。__index
引用的表以检查键 "parentID"
parent["parentID"]
所以这允许我们在表之间创建关系。我们可以使用 __index
元表方法在表示所有玩家信息的表与每个玩家自己之间建立关系,如下所示:
Player = { }
Player_metatable = {
__index = Player --look for the missing key in the Player table
}
function Player.new(name)
aPlayer = { name = name }
setmetatable(aPlayer,Player_metatable)
return aPlayer
end
function Player:rotate()
print("I'M ROTATING",tostring(self))
end
henry = Player.new("Henry")
henry:rotate()
当我们调用 Player.new("Henry")
时,我们创建了一个表,并将其元表设置为 Player_metatable
,就像设置 child 的元表一样
在第一个例子中。然而,我们只是在一个函数内执行它而不是直接执行,没有区别!
当我们调用 henry:rotate()
时,发生的情况如上文所述:我们在 henry
中寻找键 "rotate"
,但是找不到,所以我们在 Player
中查找(因为那是 __index
在我们的元表中指向的表)。我们有一个与该键关联的函数。因此,我们随后调用该函数,由于 t:function
语法,将我们自己传入。
要创建一个类的实例,您只需分配一个表,该元表指向您在其中定义类行为的表。所以我们可以创建任意数量的玩家:
my_player_name = Player.new(...)
修改 Player
表中的值,将反射(reflect)在具有关联元表的所有表中。
关于lua - 在名为 foo.lua 的 Lua 文件中,名为 self.bar、foo.bar 和 bar 的变量之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258827/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!