补充知识
局部变量&&代码块
lua
语言中的变量在默认的情况下是全局变量,所有的局部变量在使用前必须申明。
控制结构
lua
语言中所有不是false
和nil
的值当作真(0和空字符串也是真)
1 2 3 4 5 6 7 8 9 |
//if else if a < 0 then a = 0 end if a < b then return a else return b end |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//if elseif if op = "+" then r = a + b elseif op == "-" then r = a - b elseif op = "*" then r = a*b elseif op = "/" then r = a/b else error("invalid operation") end |
1 2 3 4 5 6 7 |
//while local i = 1 while a[i] do print(a[i]) i = i + 1 end |
1 2 3 4 5 6 7 |
//repeat local line repeat line = io.read() until line ~= "" print(line) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//数值for for i = 1,math.huge do if (0.3*i^3 - 20*i^2 - 500 >= 0) then print(i) break end end local found = nil for i = 1,#a do if a[i] < 0 then found = i break end end print(found) |
1 2 3 |
//泛型for //pairs,ipairs,io.lines |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//break return //用于从当前的循环结构中跳出 //所有函数的最后都有一个隐含的return,因此不需要在每一个没有返回值的函数后面写return //goto //允许跳转到函数中的任何地方 while some_condition do ::redo:: if some_oter_condition then goto continue else if yet_another_conditon then goto redo end ::continue:: end |
闭包
第一类值
一个程序可以将某个函数保存到变量中(全局变量或局部变量中),也可以保存在表中,也可以将某个函数作为参数传递给其他函数,还可以将某个函数作为其他函数的返回值返回。
词法定界
lua
语言中的函数可以访问包含其自身的外部函数中的变量
函数是第一类值
lua
语言中,所有的函数都是匿名的。
当讨论函数
1 2 3 4 |
a = { p = print} a.p("hello world") print = math.sin a.p(print(1)) |
非全局函数
函数是一种”第一类值“,它不仅可以被存在全局变量中,还可以被存在局部变量中。
1 2 3 4 5 |
Lib = {} Lib.foo = function (x,y) return x + y end Lib.goo = function (x,y) return x - y end print(Lib.foo(2,3),Lib.goo(2,3)) |
1 |
local fact |
词法定界
当编写一个被其他函数B包含的函数A时,被包含的函数A可以访问包含其的函数B的所有局部变量,我们将这种特性称为词法定界。
模式匹配
find
string.find
用于在指定的目标字符串中搜索指定的模式。
它在找到一个模式后,会返回两个值:匹配到模式的开始位置和结束位置的索引;如果没有找到任何匹配,则返回nil
find
返回的结果可用于string.sub
来获取目标字符串中相应模式的子串。可选参数:
- 3:索引,表从目标字符串的哪个位置开始搜索
- 4:
bool
,是否进行简单搜索(忽略模式,单纯地在目标字符串中搜索子串)
match
string.match
用于一个字符串中搜索模式。
返回的是目标字符串中与模式相匹配的那部分子串。
gsub
string.gsub
是将目标字符串中所有出现模式的地方换成替换字符串
- 1:目标字符串
- 2:模式
- 3:替换字符串
gmatch
string.gmatch
返回一个函数,通过返回的函数可以遍历一个字符串中所有出现的指定模式
1 2 3 4 5 6 7 |
s = "some string" words = {} for w in string.gmatch(s,"%a+") do words[#words + 1] = w end |
模式
lua
语言中的模式使用%
作为转义符
. | 任意字符 |
%a | 字母 |
%c | 控制字符 |
%d | 数字 |
%g | 除空格外的可打印字符 |
%l | 小写字母 |
%p | 标点符号 |
%s | 空白字符 |
%u | 大写字母 |
%w | 字母和数字 |
%x | 十六进制数字 |
修饰符
- +
- 重复一次或多次
- *
- 重复零次或多次
- -
- 重复零次或多次(最小匹配)
- ?
- 可选(出现零次或一次)
捕获
允许根据一个模式从目标字符串中抽出与该模式匹配的内容来用于后续用途,可以通过把模式中需要捕获的部分放到一对圆括号内来指定捕获。
1 2 3 4 5 |
pair = "name = Anna" key,value = string.match(pair,"(%a+)%s*=%s*(%a+)") print(key,value) //name Anna |
替换
string.gsub
第三个参数不仅可以是字符串,还可以是函数或表。当第三个参数是函数时,
string.gsub
会在每次找到匹配时调用该函数,参数是捕获到的内容而返回值则被作为替换字符串。当第三个参数是一个表时,
string.gsub
会把第一个捕获到的内容作为键,然后将表中对应该键的值作为替换字符串。如果函数的返回值为
nil
或者表中不包含这个键或者表中键的对应值为nil
,那么函数gsub
不改变这个匹配。
日期和时间
lua
语言的标准库提供了两个用于操作日期和时间的函数。
time
不带任何参数调用函数
os.time
,会以数字形式返回当前的日期和时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
local date = os.time() local day2year = 365.242 local sec2hour = 60*60 local sec2day = sec2hour*24 local sec2year = sec2day * day2year //年 print(date//sec2year + 1970) //时 print(date % sec2year//sec2hour) //分钟 print(date % sec2hour // 60) //秒 print(date % 60) |
date
函数
os.date
在一定程度上是函数os.time
的反函数,它可以将一个表示日期和时间的数字转换为某些高级的表示形式,要么是日期表要么是字符串。
1 2 3 |
t = os.date("*t") print(os.date("%Y/%m/%d",os.time(t))) |
位和字节
所有的位运算都针对构成一个整型数的所有位。
位运算符
- 按位与:
&
- 按位或:
- 异或:
~
- 右移:
>>
- 左移:
<<
- 按位取反:
~
二进制数据
string.pack
会把值“打包”为二进制字符串,而string.unpack
则从字符串中提取这些值。
二进制文件
io.input
和io.output
总是以文本方式打开文件。在POSIX
操作系统中,二进制文件和文本文件是没有差别的。然而,在其他一些如windows
的操作系统中,必须用特殊方式打开二进制文件。
1 2 |
local inp = assert(io.open(arg[1],"rb")) local out = assert(io.open(arg[2],"wb")) |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++_调用 Lua内容:全局表 获取&&设置10/09
- ♥ Lua_调用 C++程序里的函数,给Lua调用10/01
- ♥ Lua_基础 结构控制09/27
- ♥ Lua_基础 类型&&值09/26
- ♥ Lua_调用 C++函数:传递数组参数10/06
- ♥ Lua程序设计:二11/07