LUA语法汇总

-- ####注释方式

--单行注释
--[["多行注释"]]


-- ####类型
-- nil、number、string、boolean、table、function、userdata、thread

print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string


-- nil 作比较时应该加上双引号 "
type(X)     --nil
type(X)==nil -- false
type(X)=="nil"  -- true


-- boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都为"真":
print(type(true))
print(type(false))
print(type(nil))

if false or nil then
    print("至少有一个是 true")
else
    print("false 和 nil 都为 false!")
end

-- number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))



-- 字符串由一对双引号或单引号来表示
string1 = "this is string1"

html = [[
<html></html>
]]
print(html)

-- 数字字符串上进行算术操作时,会尝试将这个数字字符串转成一个数字:
print("2" + 6)



-- table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:
-- 创建一个空的 table
local tbl1 = {}
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}
-- 不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。
-- table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。
-- 动态构建表
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end
-- 执行结果:
-- key : value
-- 10 : 33


a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])   --执行结果:val
print(a3["none"])  --执行结果:nil



-- 函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里:
function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))



-- Lua 变量有三种类型:全局变量、局部变量、表中的域。
-- 变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
-- 局部变量的作用域为从声明位置开始到所在语句块结束。
-- 变量的默认值均为 nil

a = 5               -- 全局变量
local b = 5         -- 局部变量

function joke()
    c = 5           -- 全局变量
    local d = 6     -- 局部变量
end

joke()
print(c,d)          --> 5 nil

do
    local a = 6     -- 局部变量
    b = 6           -- 全局变量
    print(a,b);     --> 6 6
end

print(a,b)          --> 5 6


-- 赋值是改变一个变量的值和改变表域的最基本的方法。
a = "hello" .. "world"
t.n = t.n + 1
-- 对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。
a, b = 10, 2*x      --> a=10; b=2*x
-- 遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:
x, y = y, x              -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i]  -- swap 'a[i]' for 'a[j]'

-- 当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
-- a. 变量个数 > 值的个数     按变量个数补足nil
-- b. 变量个数 < 值的个数     多余的值会被忽略
a, b, c = 0, 1
print(a,b,c)             --> 0   1   nil
a, b = a+1, b+1, b+2     -- value of b+2 is ignored
print(a,b)               --> 1   2
a, b, c = 0
print(a,b,c)             --> 0   nil   nil



-- 对 table 的索引使用方括号 []。Lua 也提供了 . 操作。
t[i]
t.i                 -- 当索引为字符串类型时的一种简化写法
gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用

site = {}
site["key"] = "www"
print(site["key"])  -- www
print(site.key)     -- www



-- while循环控制语句
while( true )
do
   print("循环将永远执行下去")
end


-- 数值for循环控制语句
-- var从exp1变化到exp2,每次变化以step为步长递增var,并执行一次"执行体"。step是可选的,如果不指定,默认为1。
for var=exp1,exp2,step do
    print(var)
end




-- 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。
--[ 0 为 true ]
if(0)
then
    print("0 为 true")
end
-- if...else 语句语法格式如下:
if(布尔表达式)
then
   --[ 布尔表达式为 true 时执行该语句块 --]
else
   --[ 布尔表达式为 false 时执行该语句块 --]
end



-- Lua函数中,在return后列出要返回的值得列表即可返回多值,如:
function maximum (a)
    local mi = 1             -- 最大值索引
    local m = a[mi]          -- 最大值
    for i,val in ipairs(a) do
       if val > m then
           mi = i
           m = val
       end
    end
    return m, mi
end

print(maximum({8,10,23,12,5}))


-- Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...) 表示函数有可变的参数。
-- Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数。
-- 例如,我们计算几个数的平均值:
function average(...)
   result = 0
   local arg={...}
   for i,v in ipairs(arg) do
      result = result + v
   end
   print("总共传入 " .. #arg .. " 个数")
   return result/#arg
end

print("平均值为",average(10,5,3,4,5,6))


-- Lua提供了以下几种运算符类型:
-- 算术运算符
-- 关系运算符
-- 逻辑运算符
-- 其他运算符

-- 常用算术运算符,设定 A 的值为10,B 的值为 20:
-- +   加法  A + B 输出结果   30
-- -   减法  A - B 输出结果   -10
-- *   乘法  A * B 输出结果   200
-- /   除法  B / A w输出结果  2
-- %   取余  B % A 输出结果   0
-- ^   乘幂  A^2   输出结果   100
-- -   负号  -A    输出结果v  -10

a = 21
b = 10
c = a + b
print("Line 1 - c 的值为 ", c )    -- Line 1 - c 的值为 31
c = a - b
print("Line 2 - c 的值为 ", c )    -- Line 2 - c 的值为 11
c = a * b
print("Line 3 - c 的值为 ", c )    -- Line 3 - c 的值为 210
c = a / b
print("Line 4 - c 的值为 ", c )    -- Line 4 - c 的值为 2.1
c = a % b
print("Line 5 - c 的值为 ", c )    -- Line 5 - c 的值为 1
c = a^2
print("Line 6 - c 的值为 ", c )    -- Line 6 - c 的值为 441
c = -a
print("Line 7 - c 的值为 ", c )    -- Line 7 - c 的值为 -21


-- 常用关系运算符,设定 A 的值为10,B 的值为 20
-- ==  等于,检测两个值是否相等,相等返回 true,否则返回 false            (A == B) 为 false。
-- ~=  不等于,检测两个值是否相等,相等返回 false,否则返回 true          (A ~= B) 为 true。
-- >   大于,如果左边的值大于右边的值,返回 true,否则返回 false          (A > B) 为 false。
-- <   小于,如果左边的值大于右边的值,返回 false,否则返回 true          (A < B) 为 true。
-- >=  大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false   (A >= B) 返回 false。
-- <=  小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false  (A <= B) 返回 true。

a = true
b = true

if ( a and b )
then
   print("a and b - 条件为 true" )
end

if ( a or b )
then
   print("a or b - 条件为 true" )
end

print("---------分割线---------" )

-- 修改 a 和 b 的值
a = false
b = true

if ( a and b )
then
   print("a and b - 条件为 true" )
else
   print("a and b - 条件为 false" )
end

if ( not( a and b) )
then
   print("not( a and b) - 条件为 true" )
else
   print("not( a and b) - 条件为 false" )
end


-- 连接运算符与计算表或字符串长度的运算符:
-- ..   连接两个字符串                     a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。
-- #    一元运算符,返回字符串或表的长度。   #"Hello" 返回 5

a = "Hello "
b = "World"
print("连接字符串 a 和 b ", a..b )  -- Hello World
print("b 字符串长度 ",#b )          -- 5

-- 运算符优先级(从高到低的顺序):
-- ^
-- not    - (unary)
-- *      /
-- +      -
-- ..
-- <      >      <=     >=     ~=     ==
-- and
-- or


-- 除了^和..外所有的二元运算符都是左连接的。
-- a+i < b/2+1          <-->       (a+i) < ((b/2)+1)
-- 5+x^2*8              <-->       5+((x^2)*8)
-- a < y and y <= z     <-->       (a < y) and (y <= z)
-- -x^2                 <-->       -(x^2)
-- x^y^z                <-->       x^(y^z)


-- 字符串可以使用以下三种方式来表示:
-- 单引号间的一串字符。
-- 双引号间的一串字符。
-- [[和]]间的一串字符。

string1 = "Lua"
print(""字符串1是"",string1)
string2 = 'runoob.com'
print("字符串 2 是",string2)
string3 = [["Lua 教程"]]
print("字符串 3 是",string3)


-- 字符串操作
string.upper(argument) -- 字符串全部转为大写字母。
string.lower(argument) -- 字符串全部转为小写字母。
string.gsub(mainString,findString,replaceString,num) -- 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换)
string.find (str, substr, [init, [end]]) -- 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。
string.reverse(arg)  -- 字符串反转
string.format(...) -- 返回一个类似printf的格式化字符串
string.char(arg) -- char 将整型数字转成字符并连接
string.byte(arg[,int]) -- byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。
string.len(arg) -- 计算字符串长度
string.rep(string, n) -- 返回字符串string的n个拷贝
string.gmatch(str, pattern)  -- 回一个迭代器函数,每一次调用这个函数, 返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。
string.match(str, pattern, init) -- 只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。
string.upper(str)  -- 如何对字符串大小写进行转换
string.lower(str)
string.find(string, substr)  -- 对字符串进行查找与反转操作


-- 示例
string.gsub("aaaa","a","z",3)  -- zzza3
string.find("Hello Lua user", "Lua", 1) -- 7 9
string.reverse("Lua")   -- auL
string.format("the value is:%d",4)  -- the value is:4
string.char(97,98,99,100)  -- abcd
string.byte("ABCD",4)  -- 68
string.len("abc")   -- 3
string.rep("abcd",2) -- abcdabcd
for word in string.gmatch("Hello Lua user", "%a+") do print(word) end -- 输出: Hello Lua user
string.match("I have 2 questions for you.", "%d+ %a+")   -- 2 questions
string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)")) -- 2, "questions"
print(string.upper("Lua"))  -- LUA
string.lower("Lua") -- lua



string1 = "Lua"
string2 = "Tutorial"
number1 = 10
number2 = 20
-- 基本字符串格式化
print(string.format("基本格式化 %s %s",string1,string2))
-- 日期格式化
date = 2; month = 1; year = 2014
print(string.format("日期格式化 %02d/%02d/%03d", date, month, year))
-- 十进制格式化
print(string.format("%.4f",1/3))

string.format("%c", 83)                 -- 输出S
string.format("%+d", 17.0)              -- 输出+17
string.format("%05d", 17)               -- 输出00017
string.format("%o", 17)                 -- 输出21
string.format("%u", 3.14)               -- 输出3
string.format("%x", 13)                 -- 输出d
string.format("%X", 13)                 -- 输出D
string.format("%e", 1000)               -- 输出1.000000e+03
string.format("%E", 1000)               -- 输出1.000000E+03
string.format("%6.3f", 13)              -- 输出13.000
string.format("%q", "One
Two")         -- 输出"One
                                        --   Two"
string.format("%s", "monkey")           -- 输出monkey
string.format("%10s", "monkey")         -- 输出    monkey
string.format("%5.3s", "monkey")        -- 输出  mon


-- 所有字符类:
--[[
单个字符(除 ^$()%.[]*+-? 外): 与该字符自身配对
    .(点): 与任何字符配对
    %a: 与任何字母配对
    %c: 与任何控制符配对(例如
)
    %d: 与任何数字配对
    %l: 与任何小写字母配对
    %p: 与任何标点(punctuation)配对
    %s: 与空白字符配对
    %u: 与任何大写字母配对
    %w: 与任何字母/数字配对
    %x: 与任何十六进制数配对
    %z: 与任何代表0的字符配对
    %x(此处x是非字母非数字字符): 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*+-?)的配对问题, 例如%%与%配对
    [数个字符类]: 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对
    [^数个字符类]: 与任何不包含在[]中的字符类配对. 例如[^%s]与任何非空白字符配对
上述的字符类用大写书写时, 表示与非此字符类的任何字符配对. 例如, %S表示与任何非空白字符配对.例如,'%A'非字母的字符
]]

print(string.gsub("hello, up-down!", "%A", ".")) -- hello..up.down.    4


-- Lua中的特殊字符如下:
--[[

( ) . % + - * ? [ ^ $
'%' 用作特殊字符的转义字符,因此 '%.' 匹配点;'%%' 匹配字符 '%'。
转义字符 '%'不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。

模式条目可以是:
    单个字符类匹配该类别中任意单个字符;
    单个字符类跟一个 '*', 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串;
    单个字符类跟一个 '+', 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串;
    单个字符类跟一个 '-', 将匹配零或更多个该类的字符。 和 '*' 不同, 这个条目总是匹配尽可能短的串;
    单个字符类跟一个 '?', 将匹配零或一个该类的字符。 只要有可能,它会匹配一个;
    %n, 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。
    %bxy, 这里的 x 和 y 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 x 和 y 保持 平衡 的字符串。
      意思是,如果从左到右读这个字符串,对每次读到一个 x 就 +1 ,读到一个 y 就 -1, 最终结束处的那个 y 是第一个记数到 0 的 y。
      举个例子,条目 %b() 可以匹配到括号平衡的表达式。
    %f[set], 指 边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。
      集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 '' 一样。

    模式:
    模式 指一个模式条目的序列。 在模式最前面加上符号 '^' 将锚定从字符串的开始处做匹配。 在模式最后面加上符号 '$' 将使匹配过程锚定到字符串的结尾。 如果 '^' 和 '$' 出现在其它位置,它们均没有特殊含义,只表示自身。

捕获:
    模式可以在内部用小括号括起一个子模式; 这些子模式被称为 捕获物。
    当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。
    捕获物以它们左括号的次序来编号。
    例如,对于模式 "(a*(.)%w(%s*))" , 字符串中匹配到 "a*(.)%w(%s*)" 的部分保存在第一个捕获物中 (因此是编号 1 );
    由 "." 匹配到的字符是 2 号捕获物, 匹配到 "%s*" 的那部分是 3 号。
    作为一个特例,空的捕获 () 将捕获到当前字符串的位置(它是一个数字)。
    例如,如果将模式 "()aa()" 作用到字符串 "flaaap" 上,将产生两个捕获物: 3 和 5 。
]]



-- 一维数组可以用for循环出数组中的元素,如下实例:
array = {"Lua", "Tutorial"}
for i= 0, 2 do
   print(array[i])   -- 依次输出: nil Lua Tutorial
end
--  Lua 索引值是以 1 为起始,但你也可以指定 0 开始
for i= -2, 2 do
   print(array[i])   -- 依次输出: nil nil nil Lua Tutorial
end


-- 多维数组即数组中包含数组或一维数组的索引键对应一个数组。
array = {}
for i=1,3 do
   array[i] = {}
      for j=1,3 do
         array[i][j] = i*j
      end
end

-- 访问数组
for i=1,3 do
   for j=1,3 do
      print(array[i][j])
   end
end


-- 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素
-- 泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量
-- 泛型 for 迭代器提供了集合的 key/value 对,语法格式如下:
-- k, v为变量列表;pair(t)为表达式列表。
for k, v in pairs(t) do
    print(k, v)
end


array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
   print(key, value)
end


-- pairs 和 ipairs异同
--[[
  同:都是能遍历集合(表、数组)
  异:
    ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
    pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
]]


local tabFiles = {"alpha", "beta", [3] = "no", ["two"] = "yes"}  for i,v in ipairs(tabFiles ) do
    --输出前三个   备注:因为第四个key不是整数
    print( tabFiles [i] )
end

for i,v in pairs(tabFiles ) do    --全部输出
    print( tabFiles [i] )
end


-- table(表)的构造
-- 初始化表
mytable = {}      -- 指定值
mytable[1]= "Lua" -- 移除引用
mytable = nil     -- lua 垃圾回收会释放内存


-- Table 操作常用的方法:
table.concat (table [, sep [, start [, end]]])  -- 指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开
table.insert (table, [pos,] value)  -- 指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾
table.maxn (table)  -- 指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0(Lua5.2之后该方法已经不存在)
table.remove (table [, pos]) -- 返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起.
table.sort (table [, comp])  -- 对给定的table进行升序排序。


-- @prams t  table
-- @return 返回table中最大的值
function table_maxn(t)
  local mn=nil;
  for k, v in pairs(t) do
    if(mn==nil) then
      mn=v
    end
    if mn < v then
      mn = v
    end
  end
  return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("tbl 最大值:", table_maxn(tbl))
print("tbl 长度 ", #tbl)


fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
table.insert(fruits,"mango")  -- 在末尾插入
print("索引为 4 的元素为 ",fruits[4])
table.remove(fruits)
print("移除后最后一个元素为 ",fruits[5])
table.sort(fruits)
for k,v in ipairs(fruits) do
    print(k,v)
end



-- 日期时间函数

os.time ([table])  -- 返回当前的时间和日期(它表示从某一时刻到现在的秒数)。如果用 table 参数,它会返回一个数字,表示该 table 中 所描述的日期和时间(它表示从某一时刻到 table 中描述日期和时间的秒数)。
--[[
  table 的字段如下:
    year    四位数字
    month   1--12
    day     1--31
    hour    0--23
    min     0--59
    sec     0--61
    isdst   boolean(true表示夏令时)

  格式字符与含义:
    %a      一星期中天数的简写(例如:Wed)
    %A      一星期中天数的全称(例如:Wednesday)
    %b      月份的简写(例如:Sep)
    %B      月份的全称(例如:September)
    %c      日期和时间(例如:07/30/15 16:57:24)
    %d      一个月中的第几天[01 ~ 31]
    %H      24小时制中的小时数[00 ~ 23]
    %I      12小时制中的小时数[01 ~ 12]
    %j      一年中的第几天[001 ~ 366]
    %M      分钟数[00 ~ 59]
    %m      月份数[01 ~ 12]
    %p      “上午(am)”或“下午(pm)”
    %S      秒数[00 ~ 59]
    %w      一星期中的第几天[1 ~ 7 = 星期天 ~ 星期六]
    %x      日期(例如:07/30/15)
    %X      时间(例如:16:57:24)
    %y      两位数的年份[00 ~ 99]
    %Y      完整的年份(例如:2015)
    %%      字符'%'
]]
os.difftime (t2, t1)  -- 返回 t1 到 t2 的时间差,单位为秒。
os.date ([format [, time]]) -- 把一个表示日期和时间的数值,转换成更高级的表现形式。
                            -- 其第一个参数 format 是一个格式化字符串,描述了要返回的时间形式。
                            -- 第二个参数 time 就是日期和时间的数字表示,缺省时默认为当前的时间。
                            -- 使用格式字符 "*t",创建一个时间表。



print(os.time())    -->output  1438243393
local t1 = { year = 1970, month = 1, day = 1, hour = 8, min = 1 }
print(os.time(t1))   -->output  60
local day2 = { year = 2015, month = 7, day = 31 }
local t2 = os.time(day2)
print(os.difftime(t2, t1))   -->output  86400


local tab1 = os.date("*t")  --返回一个描述当前日期和时间的表
local ans1 = "{"
for k, v in pairs(tab1) do  --把tab1转换成一个字符串
    ans1 = string.format("%s %s = %s,", ans1, k, tostring(v))
end

ans1 = ans1 .. "}"
print("tab1 = ", ans1)
-->output
tab1 = { hour = 17, min = 28, wday = 5, day = 30, month = 7, year = 2015, sec = 10, yday = 211, isdst = false,}
tab2 = { hour = 8, min = 6, wday = 5, day = 1, month = 1, year = 1970, sec = 0, yday = 1, isdst = false,}


print(os.date("today is %A, in %B"))  -- today is Thursday, in July
print(os.date("now is %x %X"))        -- now is 07/30/15 17:39:22



-- ### 数学库

math.rad(x)       -- 角度x转换成弧度
math.deg(x)       -- 弧度x转换成角度
math.max(x, ...)  -- 返回参数中值最大的那个数,参数必须是number型
math.min(x, ...)  -- 返回参数中值最小的那个数,参数必须是number型
math.random ([m [, n]])  -- 不传入参数时,返回 一个在区间[0,1)内均匀分布的伪随机实数;
                         -- 只使用一个整数参数m时,返回一个在区间[1, m]内均匀分布的伪随机整数;
                         -- 使用两个整数参数时,返回一个在区间[m, n]内均匀分布的伪随机整数
math.randomseed (x) -- 为伪随机数生成器设置一个种子x,相同的种子将会生成相同的数字序列
math.abs(x)       -- 返回x的绝对值
math.fmod(x, y)   -- 返回 x对y取余数
math.pow(x, y)    -- 返回x的y次方
math.sqrt(x)      -- 返回x的算术平方根
math.exp(x)       -- 返回自然数e的x次方
math.log(x)       -- 返回x的自然对数
math.log10(x)     -- 返回以10为底,x的对数
math.floor(x)     -- 返回最大且不大于x的整数
math.ceil(x)      -- 返回最小且不小于x的整数
math.pi           -- 圆周率
math.sin(x)       -- 求弧度x的正弦值
math.cos(x)       -- 求弧度x的余弦值
math.tan(x)       -- 求弧度x的正切值
math.asin(x)      -- 求x的反正弦值
math.acos(x)      -- 求x的反余弦值
math.atan(x)      -- 求x的反正切值

-- ### 文件操作
--[[
    模式:
        模式      含义                                    文件不存在时
        "r"     读模式 (默认)                             返回nil加错误信息
        "w"     写模式                                    创建文件
        "a"     添加模式                                  创建文件
        "r+"    更新模式,保存之前的数据                    返回nil加错误信息
        "w+"    更新模式,清除之前的数据                    创建文件
        "a+"    添加更新模式,保存之前的数据,在文件尾进行添加 创建文件

]]
io.open (filename [, mode])  -- 按指定的模式 mode,打开一个文件名为 filename 的文件,成功则返回文件句柄,失败则返回 nil 加错误信息。
io.close ([file])            -- 关闭文件,和 file:close() 的作用相同。没有参数 file 时,关闭默认输出文件。
io.lines ([filename])        -- 打开指定的文件 filename 为读模式并返回一个迭代函数
io.output ([file])           -- 类似于 io.input,但操作在默认输出文件上。
io.read (...)                -- 相当于 io.input():read
io.type (obj)                -- 检测 obj 是否一个可用的文件句柄。
io.write (...)               -- 相当于 io.output():write。

file:read (...)              -- 按指定的格式读取一个文件。
file:close ()                -- 关闭文件。注意:当文件句柄被垃圾收集后,文件将自动关闭。句柄将变为一个不可预知的值。
file:write (...)             -- 把每一个参数的值写入文件。
                             -- 参数必须为字符串或数字,若要输出其它值,则需通过 tostring 或 string.format 进行转换。
file:seek ([whence] [, offset]) -- 设置和获取当前文件位置,成功则返回最终的文件位置(按字节,相对于文件开头) 失败则返回 nil 加错误信息。
                                -- 缺省时,whence 默认为 "cur",offset 默认为 0 。 参数 whence:
                                --      whence  含义
                                --      "set"   文件开始
                                --      "cur"   文件当前位置(默认)
                                --      "end"   文件结束

file:setvbuf (mode [, size])    -- 设置输出文件的缓冲模式
                                --      模式     含义
                                --      "no"    没有缓冲,即直接输出
                                --      "full"  全缓冲,即当缓冲满后才进行输出操作(也可调用flush马上输出)
                                --      "line"  以行为单位,进行输出
                                -- 最后两种模式,size 可以指定缓冲的大小(按字节),忽略 size 将自动调整为最佳的大小。


-- Lua I/O 库提供两种不同的方式处理文件:隐式文件描述,显式文件描述。
-- 隐式文件描述:
-- 打开已经存在的 test1.txt 文件,并读取里面的内容
file = io.input("test1.txt")    -- 使用 io.input() 函数打开文件
repeat
    line = io.read()            -- 逐行读取内容,文件结束时返回nil
    if nil == line then
        break
    end
    print(line)
until (false)
io.close(file)                  -- 关闭文件

-- 在 test1.txt 文件的最后添加一行 "hello world"
file = io.open("test1.txt", "a+")   -- 使用 io.open() 函数,以添加模式打开文件
io.output(file)                     -- 使用 io.output() 函数,设置默认输出文件
io.write("
hello world")           -- 使用 io.write() 函数,把内容写到文件
io.close(file)


-- 显式文件描述
-- 使用 file:XXX() 函数方式进行操作, 其中 file 为 io.open() 返回的文件句柄。
-- 打开已经存在的 test2.txt 文件,并读取里面的内容
file = io.open("test2.txt", "r")    -- 使用 io.open() 函数,以只读模式打开文件
for line in file:lines() do         -- 使用 file:lines() 函数逐行读取文件
   print(line)
end
file:close()
-- 在 test2.txt 文件的最后添加一行 "hello world"
file = io.open("test2.txt", "a")  -- 使用 io.open() 函数,以添加模式打开文件
file:write("
hello world")       -- 使用 file:write() 函数,在文件末尾追加内容
file:close()

原文地址:https://www.cnblogs.com/one-villager/p/9370619.html