OpenResty笔记(一)

 2017-03-20 20:21:08     OpenResty  Nginx  Lua   851


导读: Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。

任何语言的学习,都是从基础的语法开始,先从基础开始。

注释


  • 单行注释:-
  • 多行注释:-[[ 注释的内容 ]]
  • 多行注释:–[====[ 注释和内容 ]====]

基础数据类型


  • nil 空(无效值)
  • boolean 布尔(true/false)
  • number 实数(类同 C/C++ 的 double 类型)
  • string 字符串
  • table 表(关联数组)
  • function 函数

表达式


算数运算符和关系运算符,与大多数语言一致,唯一特殊的是 不等于运算的写法为 ~=。

逻辑运算符


  • and 逻辑与
  • or 逻辑或
  • not 逻辑非

例如:

a and b 如果 a 为 nil或false,则返回 a,否则返回 b
a or b 如果 a 为 nil或false,则返回 b,否则返回 a

函数


function functionName(args..) 
    ....
end
  • 函数的定义一定要在函数调用前。
  • 函数的参数为按值传递,唯一例外的是表数据类型,是按址传递。
  • 函数参数支持变长参数。
  • 函数支持多个返回值。

类库


Lua提供了丰富的标准库(Lua在线手册),便于开发使用。

模块


从Lua5.1版本开始,就对模块和包添加了新的支持,可以使用require和module来定义和使用模块和包。

require用于使用模块,module用于创建模块。

简单的说,一个模块就是一个程序库,可以通过require来加载。然后便得到了一个全局变量,表示一个table。这个table就像是一个命名空间,其内容就是模块中导出的所有东西,比如函数和常量,一个符合规范的模块还应使require返回这个table。

例如:

complex.lua文件中创建模块。

local _M = {}   -- 局部变量,模块名称

function _M.new(r, i)
    return {r = r, i = i}
end

_M.i =  _M.new(0, 1)     -- 定义一个table型常量i

function  _M.add(c1, c2)  --复数加法
    return  _M.new(c1.r + c2.r, c1.i + c2.i)
end

function  _M.sub(c1, c2)  --复数减法
    return  _M.new(c1.r - c2.r, c1.i - c2.i)
end

return  _M  -- 返回模块的table

main.lua文件中使用模块。

local complex = require "complex"

local com1 = complex.new(0, 1)
local com2 = complex.new(1, 2)

local ans = complex.add(com1, com2)
print(ans.r, ans.i)      -->output  1     3

变量


Lua 变量有三种类型:全局变量、局部变量、表中的域。

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束。

变量的默认值均为 nil。

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

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

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

循环


数值for循环

for var=exp1,exp2,exp3 do  
    <执行体>  
end

var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次"执行体"。exp3是可选的,如果不指定,默认为1。

for i=10,1,-1 do
    print(i)
end

泛型for循环

for i,v in ipairs(a) 
    do print(v) 
end

i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。

while 循环

a=10
while( a < 20 )
do
   print("a 的值为:", a)
   a = a+1
end

参考