Lua常用代码

    本文地址:http://tongxinmao.com/Article/Detail/id/164

    do
         local a1 = 10
         local a2 = 10
    end          -->a1和a2的作用域到此结束


    if op == "+" then
         r = a + b
    elseif op == "-" then
         r = a - b
    elseif op == "*" then
         r = a * b
    elseif op == "/" then
         r = a / b
    end


    while a > 0 do
         a = a - 1
         -- Do something else
    end


    repeat
      statements;
    until conditions;


    function foo(a, b, c)
       local sum = a + b
       return sum, c --函数可以返回多个值
    end

    函数可以返回多个值:return a, b, c, ...


    注释,单行用(--)来表示;多行用(--[[ ... ]])来标示;

    ~=(不等于)

    print(("1" == 1)) --false

    逻辑运算符:and、or、not;逻辑运算符认为false和nil是假(false),其他为真,0也是true. 

    ,a ? b : c  ==>>在Lua中可以这样实现: (a and b) or c 


    print(not nil) --> true 


    Userdata 嗯,这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的,在这种情况下,Userdata可以是宿主的任意数据类型,常用的有Struct和指针。



    在Lua中,字符串的第一个字符的索引是1,但是,索引也可以是负数,表示从字符串的尾部开始计数,

    string.len(s)          返回字符串s的长度;
    string.rep(s, n)      返回重复n次字符串s的串;你使用string.rep("a", 2^20)可以创建一个1M bytes的字符串(比如,为了测试需要);
    string.lower(s)       将s中的大写字母转换成小写(string.upper将小写转换成大写)。如果你想不关心大小写对一个数组进行排序的话,你可以这样:
                                 table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end)
    string.upper(s)       将s中的小写字母转换成大写
                                string.upperstring.lower都依赖于本地环境变量。所以,如果你在 European Latin-1环境下,表达式:
                                string.upper("a??o")    --> "A??O"
    string.sub(s,i,j)      函数截取字符串s的从第i个字符到第j个字符之间的串。Lua中,字符串的第一个字符索引从1开始。你也可以使用负索引,负索引从字符串的结尾向前计数:-1指向最后一个字符,-2指向倒数第二个,以此类推。所以, string.sub(s, 1, j)返回字符串s的长度为j的前缀;string.sub(s, j, -1)返回从第j个字符开始的后缀。如果不提供第3个参数,默认为-1,因此我们将最后一个调用写为string.sub(s, j);string.sub(s, 2, -2)返回去除第一个和最后一个字符后的子串。
    s = "[in brackets]"
    print(string.sub(s, 2, -2)) --> in brackets


    print(string.char(97)) --> a
    i = 99; print(string.char(i, i+1, i+2)) --> cde
    print(string.byte("abc")) --> 97
    print(string.byte("abc", 2)) --> 98
    print(string.byte("abc", -1)) --> 99 

    print(string.format("pi = %.4f", PI))
          --> pi = 3.1416
    d = 5; m = 11; y = 1990
    print(string.format("%02d/%02d/%04d", d, m, y))
            --> 05/11/1990
    tag, title = "h1", "a title"
    print(string.format("<%s>%s</%s>", tag, title, tag))
            --> <h1>a title</h1>


    string.find (s, pattern [, init [, plain]])

    gsub(string,pattern,replacement[, limitCount]) - 全局替换

    loadstring("Lua code") - 分析字符串中的lua代码块并且将结果作为一个函数返回

    strbyte(string[, index]) - 转换字符串为整数值(可以指定某个字符).

    strchar(asciiCode[, ...]) - 转换整数为相对应的字符

    strfind(string, pattern[, initpos[, plain]]) - 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置.

    strlen(string) - 返回当前字符串的字符数


    strmatch(string, pattern[, initpos]) - 与strfind不同的是,macth返回的是具体值,而find返回的是此值的位置

    下面的字符串函数是wow独有的

    strtrim(string) - 去除字符串前后空格

    strsplit(delimiter, string) - 分割字符串

    strjoin(delimiter, string, string[, ...]) - 根据定界符将字符串连接起来



    \a 响铃   \v 垂直制表符    \b 退格    \\ 反斜杠
    \f 换页符   \" 双引号     \n 换行符    \' 单引号
    \r 换行符   \[ 左方括号    \t 制表符    \] 右方括号

    ..在Lua中是字符串连接符。当在一个数字后面写..时,必须加上空格,否则出错。

    print(0 .. 1) --> 01 


    bit.bnot(a) - 返回一个a的补充

    bit.band(w1,...) - 返回w的位与

    bit.bor(w1,...) - 返回w的位或

    bit.bxor(w1,...) - 返回w的位异或

    bit.lshift(a,b) - 返回a向左偏移到b位

    bit.rshift(a,b) - 返回a逻辑右偏移到b位

    bit.arshift(a,b) - 返回a算术偏移到b位

    bit.mod(a,b) - 返回a除以b的整数余数


    6.1 table 中的每项要求是 key = value 的形式。 省略key时,会自动以1开始编号,并跳过设置过的key。
    6.2 key 只能是字符串, 这里的 web, QQ, a, b 都是字符串,但是不能加上引号, 否则出错。
    6.3 通过 key 来访问 table 的值,这时候,必须加上引号。




    1. --分割字符串的函数,类似PHP中的explode函数,使用特定的分隔符分割后返回”数组(lua中的 table)“

    2. function Split(szFullString, szSeparator)

    3.  local nFindStartIndex = 1

    4.  local nSplitIndex = 1

    5.  local nSplitArray = {}

    6. while true do

    7.    local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)

    8.    if not nFindLastIndex then

    9.     nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))

    10.     break

    11.    end

    12.    nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)

    13.    nFindStartIndex = nFindLastIndex + string.len(szSeparator)

    14.    nSplitIndex = nSplitIndex + 1

    15. end

    16.  return nSplitArray

    17. end



    1. -- 类似PHP中的Trim函数,用来去掉字符串两端多余的空白符(white Space)

    2. function trim(s) 

    3.  return (string.gsub(s, "^%s*(.-)%s*$", "%1"))

    4. end


    1. -- 延时函数,有点猥琐的实现,利用系统的ping的延时

    2. function sleep(n)

    3.    if n > 0 then os.execute("ping -n " .. tonumber(+ 1) .. " localhost > NUL") end

    4. end


    pcall (f, arg1, ···)
      功能:在保护模式下调用函数(即发生的错误将不会反射给调用者)
      当调用函数成功能返回true,失败时将返回false加错误信息

     22、tonumber (e [, base])
      功能:尝试将参数e转换为数字,当不能转换时返回nil。base(2~36)指出参数e当前使用的进制,默认为10进制,如tonumber(11,2)=3


    23、tostirng(e)
      功能:将参数e转换为字符串,此函数将会触发元表的__tostring事件

     

      24、type(v)
      功能:返回参数的类型名("nil","number", "string", "boolean", "table", "function", "thread", "userdata")

     

      25、unpack (list [, i [, j]])
      功能:返回指定表的索引的值,i为起始索引,j为结束索引。注:本函数只能用于以数字索引访问的表,否则只会返回nil 如:t={"1","cash"}

    3、dofile (filename)
      功能:打开并且执行一个lua块,当忽略参数filename时,将执行标准输入设备(stdin)的内容。返回所有块的

           返回值。当发生错误时,dofile将错误反射给调用者。注:dofile不能在保护模式下运行。

    4、error (message [, level])
      功能:终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)
      通常情况下,error会附加一些错误位置的信息到message头部.
      Level参数指示获得错误的位置,
      Level=1[默认]:为调用error位置(文件+行号)
      Level=2:指出哪个调用error的函数的函数
      Level=0:不添加错误位置信息

     

      5、_G全局环境表(全局变量)
      功能:记录全局环境的变量值的表 _G._G = _G

    math.randomseed(os.time())

    print(math.random()) -- 输出一个大于等于0,小于1的值
    print(math.random(2)) -- 输出不是1就是2
    print(math.random(3, 4)) -- 输出不是3就是4


    local tb = {10, 20, 30}
    table.insert(tb, 40) -- 在table的最后插入,结果为:{10, 20, 30, 40}
    table.insert(tb, 2, 15) -- 在table的位置2插入,结果为:{10, 15, 20, 30, 40}

    print(table.remove(tb)) -- 删除最后一个元素


    -- 默认是升序排序
    table.sort(tb)
    for _, v in ipairs(tb) do
        print(v)
    end
     
    print("=======")
     
    -- 修改为降序排序
    table.sort(tb, function (a, b) if a > b then return true end end)
    for _, v in ipairs(tb) do
        print(v)
    end




    时间:

    print(os.time()) -- 输出当前时间的描述

    time(table) - 返回从一个unix时间值

    print(os.time({year=2014,month=8,day=14}))

    函数date是time的一个反函数,它可以将一个表示日期和时间的数字转换成某些高级的表现形式。其第一个参数是格式字符串,指定了期望的表示形式;第二个参数是日期和时间的数字,默认为当前日期和时间

    local tbCurrentTime = os.date("*t") 

    date(format, time) - 返回当前用户机器上的时间.

    上一篇:OBD产品深度分析——iVoka MINI X硬件暴力拆解
    下一篇:mosquitto服务状态监控