闲扯LUA之一
·002语句结尾的分号是可选的(不建议把多条语句写在同一行)。
·003如果一行不是一个完整的Chunk,Lua等待续航,并给出提示符(一般是>>)
·004>lua -la -lb(-l选项会调用require,lua在指定的目录下搜索文件并依次执行之)。
·005>lua -i -la(-i选项让lua执行指定Chunk后进入交互模式)。
·006dofile("test.lua")(dofile函数加载文件并执行之)。
·007全局变量不需要声明,给一个变量赋值后即创建了一个全局变量。访问一个未经初始化的全局变量不会出错,得到的结果为nil。
·008Lua是大小写敏感的。
·009单行注释:--
·010多行注释:--[[ --]]
·011命令行方式:lua [options] [script [args]]
·012>lua -e "print (math.sin(12))"(-e选项:将命名直接传给Lua执行)
·013_PROMPT内置变量作为交互模式的提示符:>lua -i -e "_PROMPT='apache>'"
·014全局变量arg存放lua的命令行参数。脚本名的索引0,脚本的参数索引从1开始,脚本以前的参数从-1向左递减。
·015lua中8个基本类型:nil、boolean、number、string、userdata、function、thread、table
·016函数type可以测定给定变量或值的类型:type(print) --> function , type("h") --> string
·017给全局变量赋nil可以删除该变量
·018在控制结构的条件中除了false和nil为假外,其余都为真。Lua认为0和空串都是真
·019number类型表示实数,Lua中没有整数。
·020Lua中的字符串是不可修改的。可以创建一个新串存放想要的旧串中的数据。
·021Lua自动分配和释放对象内存。
·022Lua可以高效的处理字符串,大小为1M的字符串在Lua中是很常见的。
·023可以使用"或'表示字符串,如非需要(字符串嵌套时)尽量保持风格统一。
·024\[和\]分别表示左右中括号
·025可以使用[[字符串]]表示字符串,在这种表示方式中,如果第一个字符为换行符则会忽略。此表示方法常用于包含大段代码。
·026Lua会在string和number类型之间进行自动的类型转换,比如print("10" + 12) --> 22,print("10 + 12") --> 22,print("hello" + 12) --> ERROR(cannot convert "hello")
·027 ..表示字符连接。当在一个数字后使用..时必须加上空格以防止解释失败。print("10" .. 12) --> 1022,print(10 .. "12") --> 1022
·028 尽管数字和字符串可以自动转换,但是10 == "10"是false。
·029 可以使用tonumber()函数显示的将字符串转化为数字,如果转化失败返回nil。
·030 可以使用tostring()将数字转化为字符串,此种转换不会失败。
·031 函数是第一类值(与其它变量相同),因此函数可以被存放在普通变量中,可以作为函数的参数和返回值。
·032 Lua可以调用使用Lua或者C实现的函数,Lua所有的标准库都是使用C是实现的。标准库包括:string库、table库、I/O库、OS库、算数库、debug库。
·033 userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外没有预定义的操作。
·034Lua中不等用~=表示。
·035nil只和自己相等。
·36Lua通过引用比较userdata、table、function类型的变量,这意味着只有两者表示同一对象时才相等。
·037not和or的运算结果不是true或false,而是和它的操作数有关。例如:a and b --> 如果a为真则表达式等于b,否则表达式等于a。a or b --> 如果a为真则表达式等于a,否则表达式等于b
·038构造器是用来创建和初始化表的表达式,最简单的构造函数是{}
·039days = {"Sun", "Mon", "Tue"},其中第一个元素"Sun" 的默认索引是1, day[1]="Sun"
·040表可以使用任意的表达式初始化,也表(数组)可以包含不同类型的值。比如:a = {math.sin(1), "hello", 100000}
·041可以初始化一个表作为record:a = {x = 0, y = 1} <--> a = {}; a.x = 0; a.y = 1
·042将表的域置为nil则可以删除这个域
print(a[2]) --12
print(a[3]) --table: 0071B490
print(a[3][1]) --123
print(a[3][2]) --456
print(b.size) --12
print(b[1].px) --123
print(b[1].py) --456
·044可以使用如下的方式显示的表示初始值的索引:a = {["+"] = "plus", 1 = "hello"}。不推荐使用0最为元素的索引,因为这将导致很多库函数无法使用。
·045a = {1, 2, 3, }最后的,号是可选的,写上可以方便扩展。
·046a = {1, 2; "hello", "wrold"; print},域中元素的分隔符可以是,也可以是;通常使用";"间隔不同类型的元素。
·048多值赋值常用于交换变量,或函数调用结果返回给变量,比如a, b = fun()此表达式将fun函数返回的两个值赋给a,b。
·049使用local创建一个局部变量(推荐使用局部变量,访问局部变量的速度会快些),局部变量只在被声明的代码块内有效。在交互模式下需要将local包含在do...end中间(相当于C语言中的{}),因为在交互模式下local i = 1就是一个Chunk,在之后的语句中i已经失效啦。使用局部变量可以避免命名冲突。
·050对于for var = exp1, exp2, exp3 do ... end,exp3为步长,缺省为1,且三个表达式的值仅计算一次。例如:for i = 1, f(x) do ... end。f(x) 只会在循环前计算一次。var是被自动声明的局部变量只在循环内有效。
·051范型for循环:a = {"Sun", "Mon", "Tue",}; for i, wk in ipairs(a) do print(i, wk) end 输出结果:
1 Sun
2 Mon
3 Tue
for key in pairs(a) do print(key) end 输出结果:
1
2
3
·052Lua要求break和return只能出现在Chunk的最后一句(end或else或until之前)。如果需要在chunk的中间使用break或return则可使用do break/return end实现。