全局变量
lua中全局变量不需要声明
function funcA()
a = 30
end
funcA()
print(a)
Lua中访问一个未初始化的变量不会引发错误,是一个特殊值nil,需要删除一个全局变量,将其值赋值nil就行.
类型与值
8种基础类型:nil,boolean,number,string,userdata,function,thread,table
使用 type 函数可以返回值的类型名称,type(type(X)) 返回一个string,与x值无关,
而是 type 函数总是返回一个字符串。
-
nil
无效值,将nil赋予一个变量相当于删除它。 -
boolean
在Lua中任何值都可以表示一个条件。Lua将值false和nil视为“假”,空字符串也为“真” -
number
Lua所有数字不分整型和浮点型,number表示实数(双精度浮点数),可以表示任何 32 位整数。 -
string
Lua的字符串通常表示“一个字符序列”,完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0。可以将任意二进制数据存储到一个字符串中。
Lua的字符串是不可变的值,不能像在C语言中那样直接修改祖父穿的某个字符,而是应该根据修改要求来创建一个新的字符串。
a = "one string"
b = string.gsub( a,"one","another")
print(a)
print(b)
如果字符串本身包含引号,则需要转义 [ \ " ] 或者 [ ’ " ]
可以通过匹配的双方括号来界定一个字母字符串,就像写“块注释”一样。这种形式书写的字符串可以延申多行,Lua不会解释其中的转义序列。
page = [[
<html>
<head>
<title>An Html Page</title>
</head>
</html>
]]
print(page)
这对于书写含有程序代码的字符串尤为有用。
Lua提供了运行时的数字与字符串的自动转换,在一个字符串上应用算数操作时,Lua会尝试将这个字符串转换成一个数字。如
print("10"+1) -- 结果为 11
print("hello" + 1) --报错,hello无法转换
print("10 + 1") -- 10 + 1
print(10 .. 20) -- 1020
字符串连接操作符是两个点,当在一个数字后面使用它的时候,必须用一个空格来分隔,不然,Lua会将第一个点理解为小数点。
tostring tonumber 可以对字符串和数字进行转换
”#“可以放在字符串前来获取字符串长度
a = "helo"
print(#a) -- 4
- table
table类型实现了”关联数组“,一种具有特殊索引方式的数组。可以通过整数,字符串或其它类型的值(除了nil)来索引它。table没有固定大小,可以动态添加任意数量的元素到table中,table是Lua中主要的数据结构机制。可表示,数组,符号表,集合,记录,队列和其它数据结构。Lua也是通过table来表示模块,包,对象的。
当输入 io.read 时,含义是 “io模块中的read函数”,对于Lua而言,这表示使用字符串"read"作为key来索引 table “io”
table不是值,也不是变量,而是"对象",可以将table想象成一种动态分配的对象,程序中仅持有一个对它的引用。
table 永远是匿名的,一个持有table 的变量与table 自身之间没有固定的关联性。若有引用,置空就可以了。
a = {}
b = a
b = nil
当一个程序再也没有一个对table的引用时,Lua的垃圾收集器会删除该table,并复用它的内存。
也可以使用 a.x 来索引 table 的值,两种形式是等价的
a.x 和 a[x]是不同的,前者表示 a[“x”],后者表示以变量x的值来索引table
x = 3
a = {}
a.x = 6
print(a.x) -- 6
print(a[x]) -- nil
数组通常以1为索引的起始值。 # 可以获取数组的长度
但是,由于数组实际上是一个table。索引它的大小概念可能有些模糊。如
a = { }
a[1000] = 1
它的大小算是多少呢?
a = {}
a[1] = 2
a[1000] = 1
print(#a) -- 1
所有未初始化的元素的索引结果都是nil,Lua 将nil作为界定数组结尾的标志,上述例子在遍历到第二个元素就停止了。
- function
Lua中,函数是一类值,可以存储在变量中,可以用过参数传递给其它函数,还可以作为函数的返回值,Lua既可以调用自身Lua编写的函数,也可以调用C语言编写的函数,Lua所有的标准库都是用C语言写的。 - userdata 和 thread
userdata用于表示一种由应用程序或C语言库创建的新类型,例如I/O库就用userdata来表示文件