table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。
对于全局变量和 table,nil 还有一个"删除"作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都为"真
字符串连接..
--连接两个字符串
print("12" .. "45");
--连接两个数字,..符号两个有空格
print(12 .. 45);
#计算字符串长度
print(#"12");
len = "hello world";
print(#len);
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
table function
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显示声明为局部变量。变量的默认值均为 nil。
b = "good";
c = 1243;
print(b, c, b, c);
c = b .. " morning";
print(c);
如果要对多个变量赋值必须依次对每个变量赋值。
a, b, c = 0, 0, 0
a, b = f()
f()返回两个值,第一个赋给a,第二个赋给b。
应该尽可能的使用局部变量,有两个好处:
1. 避免命名冲突。
2. 访问局部变量的速度比全局变量更快
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。
要注意的是Lua中 0 为 true:
function getMax(num1, num2)
if (num1 > num2) then
return num1;
else
return num2;
end;
return resutl;
end;
print(getMax(3, 5));
在 Lua 索引值是以 1 为起始,但你也可以指定 0 开始
for将用exp3作为step从exp1(初始值)到exp2(终止值),执行loop-part。其中exp3可以省略,默认step=1
for init,max/min value, increment
if for while 以 end作为结尾
lua不支持switch,所以一连串的if elseif是很常见的
for循环的3个表达式的值是在循环开始前一次性求值的。另外,控制变量会被自动的声明为for循环的局部local变量,仅在循环体内可见。
lua中的字符串是不可变值。
lua既可以调用自身Lua语言编写的函数,又可以调用以c语言编写的函数。
table类型实现了关联数组,关联数组是一种具有特殊索引方式的数组。在lua中,table既不是值,也不是变量,而是对象。可以将table想象成一种动态分配的对象,程序仅持有一个对它们的引用(或指针),Lua不会暗中产生table的副本或创建新的table。table的创建是通过构造函数表达式完成的,最简单的构造表达式就是{};
如:
a = {};创建了一个table,并将它的引用存储到a
table可以用不同类型的索引来访问value值,当需要容纳新条目时,table会自动增长。
-- test4.lua begin
module("test4", package.seeall);
function getTab(r, i)
return {r = r, i = i};
end
function getTabNum(tab)
local count = 0;
for key, val in pairs(tab) do
count = count + 1;
end
return count;
end
-- test4.lua end
-- test5.lua begin
require("test4")
tab = {1, 2, 3, 56, 8};
print(test4.getTabNum(tab));
-- test5.lua end
运行lua程序块的一种方式dofile,这个函数会立即执行一个文件。也就是会加载该文件中的程序。如果要测试一段代码,dofile比较有用,可以同时打开两个窗口,一个文本编辑器用于编辑代码文件,如hello.lua文件,另一个命令行窗口中运行解释器的交互模式,当编辑完成代码并保存后,可以在解释器的交互模式窗口中执行dofile("hello.lua")来加载新的代码,这样便可以测试新代码,调用其中的函数并打印结果了。
lua全局变量不需要声明,只需要将一个值赋予一个全局变量就可以创建了,在Lua中,访问一个未初始化的变量不会引发错误,访问结果是一个特殊的nil值。
通常没有必要删除一个全局变量,如果一个变量只有较短的生命周期,那么就应该使用局部变脸,但是如果一定要删除某个全局变量的话,只需将其赋值为nil,在赋值之后,Lua就好像从未使用过这个变量一样,换句话来说,如果存在一个全局变量,那么它必定有一个非nil值。
lua中有8中数据类型:nil, boolean, number, string, userdata自定义, function函数,thread线程,table表。函数type可以返回变量类型。
一个全局变量在第一次赋值前的默认值就是nil,将nil赋值给一个全局变量就等同于删除它。lua将nil用于表示一种无效值的情况,即没有任何有效值的情况。
boolean取值为false或true,Lua将false和nil视为假,其他为真,即使0和空字符串也为真。
lua的number类型可以表示整数、浮点数等
lua的string类型字符串是不可变的指,不能像C语言那样直接修改字符串的某个字符,而是应该根据修改要求来创建一个新的字符。字面字符串需要一对双引号或单引号来界定。
lua table类型实现了“关联数组”。
lua既可以调用以自身Lua语言编写的函数,又可以调用以C语言编写的函数,Lua所有的标准库都是用C语言写的,标准库中包括对字符串的操作,table的操作,I/O操作,操作系统功能调用,数学函数和调试函数。
连接两个字符串,可以使用操作符.. 如果其中任意一个操作数是数字的话,Lua会将该数字转换为一个字符串。print("hello" .. "world"), print(0 .. 4)
谨记,Lua中的字符串是不可变的值,连接操作符只会创建一个新的字符串,而不会对其原操作数进行任何修改:
如:
a = "hello"
print(a .. " world");
print(a) --仍然是hello
相对于全局变量,Lua还提供了局部变量,通过local语句来创建局部变量。如:
j = 10; --全局变量
local i = j; --i是局部变量
尽可能使用局部变量是一种良好的编程风格,局部变量可以避免将一些无用的名称引入全局环境,避免搞乱了全局环境。
lua中的控制结构中的条件表达式可以是任何值,lua将所有不是false和nil的值视为真,比如0和空串都为真。
lua允许函数返回多个值:
s, e = string.find("hello lua users", "lua");
loadstring
require,用于使用模块;module用于创建模块
一个模块就是一个程序库,可以通过require来加载,然后得到一个全局变量,表示一个table,这个table就像一个名称空间,其内容就是模块中导出的所有东西,包括函数和常量。一个规范的模块还应使require返回这个table。如果希望使用较短的模块名称,则可以为模块设置一个局部名称local m = require "mod"; m.foo();
pairs()函数遍历整个table
.table是一个“关联数组”,数组的索引可以是数字或者是字符串
//以下两种方法都可以用来获取talbe中元素个数
print(table.getn(mytable))
print(#mytable);
无论任何类型,type(x)返回的是字符串,如number是一个字符串,nil是一个字符串,string是一个字符串
[[……]]里面可以包含字符串,可以多行,也可以嵌套,而且也不会被转义,用来包含一段代码是很方便的。
if elseif 要有then ,结束要 有end
function结束要有end
当一个字符串使用算术操作时,会被转换为数字
print("10" + 1); -- 11
print("hello" + "good"); --wrong,字符串连接用..
print(12 .. 34); --也可以用来连接两个数字,结果1234
lua中的函数可以有名字也可以是匿名的
linux库 /lib
头文件 /usr/include /usr/local/include
ldd test可以查看可执行文件test用了哪些库
编译时默认连接C库,如果要用其他库,编译时要用-l,例如数学库-lm, C库-lc
core文件是系统进程出现异常退出时候,保存的上下文信息,在调试的时候需要用到
cat -n