一、Lua基础知识
Lua区分大小写。
几条连续的Lua语句之间不需要分割,如果需要可以用分号;分割。
一般约定以下划线开头连接一串大写字母变量(比如 _VERSION)被保留用于 Lua 内部全局变量。
默认情况,变量总是全局的。
全局变量不需要声明,给一个变量赋值后即创建了这个全局变量。
访问一个没有初始化的全局变量返回结果是nil。
删除一个全局变量,只需要将变量赋值为nil。
当且仅当一个变量不等于nil时,这个变量即存在。
字符串由一对双引号或单引号来表示。
function是一种数据类型,表示C或Lua编写的函数。函数可以存在变量里。
给全局变量赋一个nil值,等同于把它们删掉。
Lua把false和nil看作是"假",其他的都为"真"。
以用2个方括号"[[]]"来表示"一块"字符串。
字符串连接使用的是..,在数字后面使用时要加个空格。
尽量避免使用强制转换,可以使用函数tonumber将字符串转为数字(无法转换返回nil),tostring将数字转为字符串。
使用#来计算字符串或表的长度,放在前面#str。a["name"]可以写作a.name 。
在Lua里表的默认初始索引一般以1开始。
Lua函数可以存储在变量中,可以通过参数传递给其他函数,可以作为其他函数的返回值。
Lua函数可以返回多个值,每个值以逗号隔开。
Lua函数可以接受可变数目的参数,在函数参数列表中使用三点(...) 表示函数有可变的参数。
Lua将可变函数的参数放在一个叫arg的表中,#arg表示传入参数的个数。
Lua脚本执行:lua luascript.lua
==用于相等性测试,~=用于不等性测试。nil只与自身相等。
多重赋值中,Lua先对等号右边所有元素求值,然后才进行赋值:x,y = y,x 等同于交换x y变量的值。
使用do-end,可以显示的界定一个程序块,lua不会单独执行do后面的每行内容,直至遇到一个相应的end。
尽可能的使用局部变量。
break和return只能是程序块的最后一条语句,如果想要放在其他位置,需要显示的do-end包住一个return。
lua函数出现在一个表达式中,lua会把函数的返回值数量调整为1。table构造式{}可以完整的接收一个函数调用的所有结果,不会有任何数量方面的调整。但仅限于函数调用作为table最后一个元素时才会发生,其他位置的函数调用仅产生一个结果值。可以将函数调用放入一对()中,从而迫使他只返回一个结果:(foo())
unpack函数
(lua 5.2)
二、关于table表
1、先定义一个空table:
-- 定义一个全局的table test_table = {} -- 打印出来,结果是table的地址 print(test_table) -- 输出结果 table: 0073B1C8
然后可以给table赋值:
test_table[1]="a" test_table[2]="b" test_table[3]="c" for k,v in pairs(test_table) do print( test_table[k] ) end输出为a,b,c。
2、当然也可以这样定义key为字符串:
test_table = {[1]="a",[2]="b",[3]="c",["str1"]="d",["str2"]="e"} for k,v in pairs(test_table) do print( k,"-",v ) end
这时打印结果为:
str2 - e 2 - b 3 - c 1 - a str1 - d
发现其实并不是按照顺序打印的:原因是pairs方法是根据key的hash值进行遍历的,不能保证顺序,但是却可以遍历table的全部key。
3、如果换成ipairs方法:
for k,v in ipairs(test_table) do print( k,"-",v ) end
结果为:
1 - a 2 - b 3 - c
原因是ipairs方法,只会遍历key是整数,且从1开始key连续的数据(如果没有从1开始,或者不连续的key是不会遍历的)。换一种方式:
for i=1, #(test_table) do print(test_table[i]) end
和ipairs遍历结果一致,#(test_table)代表获取table的长度,不过:
test_table = {[1]="a",[2]="b",[3]="c",[5]="f",["str1"]="d",["str2"]="e"} print(#(test_table)) --此处返回3,而不是6
#(test_table)也只会取key是整数,且从1开始key连续的数据(5虽然是整数key,但不连续)。
如果没有key为1的数据,则#(test_table)结果为0。
注意:
不要在lua的table中使用nil值,如果一个元素要删除,直接remove,不要用nil去代替。
原因看这里:http://www.jb51.net/article/64668.htm
5、table中删除元素:
table.remove(test_table) --删除整数索引的最后一个 table.remove(test_table,pos) --删除整数索引的第pos位置的
删除以后,后面的元素会向前移动。
6、如果table声明时不指定key:
test_table={"a","b","c","d","e"} for k,v in ipairs(test_table) do print( k,"-",v ) end
这样其实是默认从1开始为key赋值,返回结果为:
1 - a 2 - b 3 - c 4 - d 5 - e
7、如果出现了字符串key与整数key混搭的情况:
test_table={"a","b",["string1"]="str1","c","d","e","f",["string2"]="str2",string3="str3",[8]="h"} for k,v in pairs(test_table) do -- pairs遍历 print( k,"-",v ) end
结果为:
1 - a 2 - b 3 - c 4 - d 5 - e 6 - f 8 - h string2 - str2 string3 - str3 string1 - str1
可以看出这里key为string3的声明方式,直接使用了字面量,与["string3"]="str3"是相同的。
如果换做ipairs方式遍历结果为:
1 - a 2 - b 3 - c 4 - d 5 - e 6 - f
发现声明的[8]="h"并没有打印,因为前面的a、b、c、d、e、f整数索引是自动生成的,可以保证连续性,这里手工指定的并不连续。
8、如果手工赋值与自动生成整型key同时使用:
test_table={"a","b","c","d","e","f",[1]="x",[2]="x",[3]="x",[4]="x",[5]="x",[6]="x"} for k,v in pairs(test_table) do print( k,"-",v ) end
pairs遍历结果:
1 - a 2 - b 3 - c 4 - d 5 - e 6 - f
可见手工赋值并没有起作用(虽然赋值是在最后)。
9、table的遍历
上面介绍了3种table的遍历方式:
--pairs (可以遍历全部元素,包括string型key) for k,v in pairs(test_table) do print( k,"-",v ) end --ipairs(只能遍历整型key) for k,v in ipairs(test_table) do print( k,"-",v ) end --计数(只能遍历整型key) for i=1, 10 do print(test_table[i]) end
10、table连接:
test_table={"a","b","c",[4]="d",[5]="e",[6]="f",["str1"]="x2",str2="x1",[3]="x",[4]="x"} print(table.concat(test_table))
table.concat 函数可以连接table中的数组部分的元素,上面程序执行的结果为:abcxef
其中d变为了x,是因为后面对4位置重新进行了赋值。但c因为是自动生成的整型key,所以没有被替换为x。
如果数组部分的key不连续,比如test_table后面又加了[8]="i"(但其实没有key=7的位置),这样使用table.concat就会报错,如:invalid value (nil) at index 7 in table for 'concat'
str1和str2的key没有被连接,是因为这里并不是整型key,不算做数组部分的元素。
11、table排序:
给定的table进行升序排序,其他排序可以通过比较器实现。
http://www.jb51.net/article/55718.htm 排序实例
12、table取最大值:
Lua5.2之后table.maxn方法已经不存在了:
http://www.cnblogs.com/liqiu/archive/2012/12/28/lua.html
相关推荐
lua学习笔记
自己学习lua记得笔记,做任务用的~很基础的东西,想要的拿走,免费
主要介绍了Lua学习笔记之函数、变长参数、closure(闭包)、select等,本文着重讲解了这些特性的用法,并给出代码实例,需要的朋友可以参考下
在Lua中,表达式包括:数值常量、字符串字面值、变量、单目和双目运算符,函数调用,也包括一些非传统的函数定义和表结构。今天我们就来详细了解下lua中的表达式
本文详细的总结了Lua中的类型与值,对于实际编程中容易出错的地方也进行了详细的总结,十分的全面实用。有需要的小伙伴可以参考下。
lua (vc环境)学习笔记(学习代码) lua (vc环境)学习笔记(学习代码) lua (vc环境)学习笔记(学习代码)
学习笔记,lua学习基础笔记,小知识点,下载嘘谨慎,没有想象中完美
有其他语言基础学习lua入门是比较快的,主要是学习lua跟其他语言的一些区别,一些特性
Lua的table元表自我学习笔记分享。--lua元表总结 --1、__index的运用 (调用table的一个不存在的索引时,会使用到元表的__index元方法,搜索元表是否也有改索引,__index可以是一个函数也可是一个table。)
Lua学习笔记v1.0 通过__《Programming in Lua》__和**《Lua程序设计》**以及网上关于Lua的相关资料,进行学习整理,总结出这一份学习笔记。为后面的初学者提供参考。 本资料针对的是Lua5.1版本,5.2版本以后语法和库...
自我学习笔记--LUA;python:网络编程等
LuaPlus上手指南 Lua脚本语法说明 Lua中文教程 好用的Lua For C++扩展(修订)
LuaLua的简单学习笔记
主要介绍了Lua table类型学习笔记,本文讲解了table的基础知识和table库函数的使用以及面向对象编程实例,需要的朋友可以参考下
为此笔者(游标)通过在网上的找到的一则(共四篇)学习笔记,经过一次次失败,算是初入Lua的大门。 原帖地址:http://www.cnitblog.com/xkz/category/8679.html【向作者表示感谢】 在此将自己根据帖子做的实例发给...
Lua脚本语方学习笔记,作为学习lua的参考
nginx+lua开发的学习笔记~~~、希望有所帮助、共同成长~
lua,lua文档,vs2008,代码 相关学习笔记