Lua 学习笔记

来源:互联网 发布:淘宝上有没有猛将气 编辑:程序博客网 时间:2024/06/05 07:09

1、关于table

Lua 中的 table 是python 中的 list 和 dict 的混合体。

t = {6, 7, 8, [3.14] = 6, s = "hello", [20] = 100)}
相当于:

t = {[1] = 6, [2] = 7, [3]= 8, [3.14] = 6, ["s"] = "hello", [20] = 100}
简单的看,实际上完全相当于 python 中的 dict ,不过实际对于键为整数的,是放在 list 中的,方便快速索引。当然基于节省内存的考量,对于跳跃的大整数键,依然是放在 dict 中。

比如上边的 t[20] = 100 就是放在dict 当中,但是6, 7, 8 都是放在 list 当中。

于是, 对于

t = {6, 7, 8, [3.14] = 6, s = "hello", [20] = 100, function () print("hello world") end}

#t 得到的长度为 4,也即 list 的长度,即匿名的 function 也是放在list 当中的。

所以有下边的执行结果:


2、属性的访问

同 python 一样,t.attr 的访问形式最终都转换为了 t["attr"] 的形式。

3、变量的作用域

Lua 中的变量只有 local 和 global 两种,不像 python ,有 local ,nonlocal,和 global。 而且 Lua 的 local 和 global 不是通过 end 语句块来界定的,而是用 local 关键字来申明的,否则都是 global 全局变量。

function func(x) a = 2 print(x) end

在 func 函数执行之后,便有了全局变量 a.


注意上边当 func 函数执行之前,因为没有执行 a = 2 这条语句,所以那时还不存在全局变量 a. 另外,在 Lua 中,所有的全局变量都是存在 _G 这个 table 当中的,即每次对全局变量 x 的访问,实际都是 _G["x"] 的形式。所以对于不存在的全局变量,得到的是 nil,而不是像 python当中的异常报错。

4、面向对象

Lua 的表的方法在用 : 进行定义时,含有隐藏的参数 self(不能在参数列表中显示的写出来,类似于 C++ 的 this 指针)。所以通过 “:” 定义的函数,在使用 “.” 点号来调用时,需要多传一个表示 self 的参数。所以使用 “:” 才是更好的模拟面向对象。