Lua学习笔记(1)--基本知识介绍

来源:互联网 发布:百度人工智能智库 编辑:程序博客网 时间:2024/05/20 00:09

Lua有大小写之分,"and"是一个保留字,但"And"和"AND"却是两个不同的标识符

Lua行注释 --

Lua块注释 --[[       --]]

Lua有8种基础类型:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、thread(线程)和table(表)。含数type可根据一个值返回其类型名称。

print(type("Hello world"))     -->string

print(type(10.4*3))              -->number

print(type(print))                  -->function

print(type(true))                  -->boolean

print(type(nil))                     -->nil

print(type(type(x)))              -->string

最后一行将永远返回"string",而无关乎X这个值的内容。这是因为type函数总是返回一个字符串。

变量没有预定义的类型,任何变量都可以包含任何类型的值:

print(type(a))                         -->nil(a尚未初始化)

a = 10

print(type(a))                        -->number

a = "a string!!"

print(type(a))                         -->string

a = print                                -->是的,这是合法的!

a(type(a))                              -->function

请注意最后两行。在Lua专用,函数是作为“第一类值(first-class value)”来看待的,可以像操作其他值一样来操作一个函数值。

将一个变量用于不同的类型,通常会导致混乱的代码,但有时明智地使用这种特性会带来便利。例如,在异常情况下,可以返回一个nil以区别于其他正常的返回值。

在Lua中,table既不是“值”也不是“变量”,而是“对象”。可以将一个table想象成一种动态分配的对象,程序仅持有一个对它们的引用(或指针),Lua不会暗中产生table的副本或创建新的table。此外,在Lua中也不需要声明一个table。事实上也没有办法可以声明table。table的闯将是通过“构造表达式(constructor expression)”完成的,最简单的构造表达式就是 {} 。

a = {}              --创建一个table,并将它的引用存储到a

k = "x"            

a[k] = 10        --新条目,key = "x", value = 10

a[20] = "great"    --新条目,key = 20, value = "great"

print(a["x"])         -->10

k = 20

print(a[k])           -->"great"

a["x"] = a["x"] + 1     --递增条目"x"

print(a["x"])            -->11

 

table永远是“匿名的(anonymous)”,一个持有table的变量与table自身之间没有固定的关联性。

 

a = {}

a["x"] = 10

b = a               -- b与a引用了同一个table

print(b["x"])       -->10

b["x"] = 20

print(a["x"])         -->20

a = nil               -- 现在只有b还在引用table

a = nil              --再也没有对table的引用了

当一个程序再也没有对一个table的引用时,Lua的垃圾收集器(garbage collector)最终会删除该table,并复用它的内存。

所有table都可以用不同类型的索引来访问value,当需要容纳新条目(entry)时,table会自动增长。

 

a.x = 10                  --等同于a["x"] = 10

print(a.x)                 --等同于print(a["x"])

print(a.y)                 --等同于print(a["y"])

不要将a.x和a[x]搞错。前者表示a["x"],表示以字符串"x"来索引table。而后者是以变量x的值来索引table。下例说明了这种区别:

a = {}

x = "y"

a[x] = 10               --将10放入字段"y"

print(a[x])              -->10     --字段"y"的值

print(a.x)                -->nil    --字段"x"(未定义的)的值

print(a.y)               -->10    --字段"y"的值

 

就Lua的习惯而言,数组通常以1作为索引的起始值,并且有不少机制依赖于这个惯例。

长度操作符"#"用于返回一个数组或线性表的最后一个索引值(或为其大小)。

以下是几种长度操作符在Lua中的习惯写法:

print(a[#a])               --打印列表a的最后一个值

a[#a] = nil                 --删除最后一个值

a[#a+1] = v              --将v添加到列表末尾

 

a = {}

a[10000] = 1

print(table.maxn(a))            -->10000