类型与值
Lua8种基本类型
nil类型(空)、boolean(布尔类型)、number(数字类型)、string(字符串)、userdata(自定义)、function(函数)、thread(线程)和table(表)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 print (type ("Hello World !" )) print (type (10 *3 )) print (type (print )) print (type (type )) print (type (true )) print (type (nil )) print (type (type (X))) print (type (a)) a = 10 print (type (a)) a = "string" print (type (a)) a = print a(type (a))
nil(空)
nil 是一种类型,只有一个 nil 值 ,它的主要能工是用来区别其他任何值。用于表示无效值。
boolean(布尔)
Lua将false和nil值视为假,将除此之外的值视为真。
number(数字)
number类型表示实数。lua中所有的数字可以表示任何一个32位的整数,而不会产生四舍五入的错误。并且现在有的cpu浮点数运算可能更快。
也可以通过重新编译lua,也可以用其他类型表示数字。具体做法详见发行版中的luaconf.h
string(字符串)
lua中的字符串通常表示一个字符序列。其采用8位编码,lua字符串中的字符可以具有任何数字值编码,包括数值0,它可以讲任意二进制数据存储到一个字符串中。
lua的字符串是不可变值,修改字符需要创建一个新的字符串。
一对匹配引号(""或’’)界定字符串
一对匹配双方括号界定字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 function my_string () print ("用双引号界定打印字符串" ) print ("one line\n\"in quotes \",'in quotes'" ) print ("用单引号界定打印字符串" ) print ('a backslash inside quotes : \'\\\'' ) print ("用ascii码打印字符串" ) print ("正常字符" ) print ("alo\n123\"" ) print ("ascii码字符" ) print ('\97lo\10\04923"' ) print ("用双方括号界定打印字符串" ) page = [==[ --[[ a=b[c[i]] --]] ]==] page1 = [[ <html> <body> <a href="http://www.lua.org">Lua</a> </body> </html> ]] print (page) print (page1) end my_string()
数字与字符串的自动转换
1 2 3 4 5 6 print ("10" + 1 ) print ("10 + 1" ) print ("-5.3e-10" *"2" ) print (10 .. 20 ) print ("10" .. "20" )
使用tonumber将字符串转换为数字
1 2 3 4 5 6 7 8 9 10 11 12 13 line = io .read () n = tonumber (line) if n == nil then error (line .. "is not a vaild number" ) else print (n*2 ) end s = tostring (n) print (s == "10" ) print (10 .. "" == "10" )
获取字符串的长度
1 2 3 a = "hello world" print (#a) print (#"good\0bye" )
table(表)
table类型实现了关联数组,它具有一种特殊的索引方式,可以使用字符串、整数等来索引(除了nil)。
table是一个对象,是一种动态分配的对象。
lua中通过table表示普通数组、符号表、集合、记录、队列和其他数据结构。
lua通过table表示模块、包和对象。比如io.read(),表示使用字符串read作为key来索引table类型的io。
table的创建是由动态表达式完成的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a = {} k = "color" a[k] = "green" print (a[k]) a[9 ] = "great" print (a[9 ]) a["num" ] = 10 print (a["num" ]) k = 9 print (a[k]) a["num" ] = a["num" ]+1 print (a["num" ])
table永远是匿名的,table变量和自身没有固定联系
1 2 3 4 5 6 7 8 a = {} a["x" ] = 10 b = a print (b["x" ]) b["x" ] = 20 print (a["x" ])a = nil b = nil
table会自增长
1 2 3 4 5 6 7 8 9 10 11 a = {} for i=1 ,1000 do a[i] = i*2 end print (a[9 ]) a["x" ] = 10 print (a["x" ]) print (a["y" ])
a.x和a[x]的区别
a.x等同于a[“x”],a.x中的x是table中的key(通常这个key是固定不变的),a[x]中的x是变量,它可以指定一个key。
table的索引
table中的索引以1作为索引起始值。长度操作符"#“返回的是最后一个索引值。
长度操作符”#"用来处理没有空隙的数组。table.maxn用来处理有空隙的数组。
1 2 3 4 5 6 7 8 9 a = {} a[1000 ] = 1 print (table .maxn (a)) b = {} for i=1 ,10 do b[i]=i*2 end print (#b)
key值问题
table中任何类型都可以用来索引,如果是数字0和字符"0"作索引,它们不是一个索引,会被分为两个。遇到这样的,我们可以用显示转换。
1 2 3 4 5 6 7 8 9 10 11 i = 10 ; j = "10" ; k = "+10" a = {} a[i] = "one value" a[j] = "another value" a[k] = "yet another value" print (a[i])print (a[j])print (a[tonumber (j)]) print (a[tonumber (k)])
function(函数)
函数可以存储到变量中,可以通过参数传递给其他函数,可以作为其他函数的返回值。
lua可以调用自身lua语言写的函数,也可以调用 c语言写的函数。
userdata(自定义类型)和thread(线程)
userdata类型可以将任意c语言数据存储到lua变量中。标准的I/O库就用userdata表示文件。