Lua 程序设计

Lua 是由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于1993年开发的一种轻量、小巧的脚本语言,用标准 C 语言编写,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
官网:http://www.lua.org/
Redis 在 2.6 版本中推出了脚本功能,允许开发者将 Lua 语言编写的脚本传到 Redis 中执行。使用 Lua 脚本的优点有如下几点:

  • 减少网络开销:本来需要多次请求的操作,可以一次请求完成,从而节约网络开销;
  • 原子操作:Redis 会将整个脚本作为一个整体执行,中间不会执行其它命令;
  • 复用:客户端发送的脚本会存储在 Redis 中,从而实现脚本的复用。

Lua基础语法

hello world

  1. print("hello world!")

保留关键字

  1. and
  2. break
  3. do
  4. else
  5. elseif
  6. end
  7. false
  8. for
  9. function
  10. if
  11. in
  12. local
  13. nil
  14. not
  15. or
  16. repeat
  17. return
  18. then
  19. true
  20. until
  21. while

注释

  1. -- 两个减号是行注释
  2. --[[
  3. 这是块注释
  4. 这是块注释.
  5. --]]

变量

  1. 数字类型
  2. Lua的数字只有double型,64bits
  3. 你可以以如下的方式表示数字
  4. num = 1024
  5. num = 3.0
  6. num = 3.1416
  7. num = 314.16e-2
  8. num = 0.31416E1
  9. num = 0xff
  10. num = 0x56
  11. 字符串
  12. 可以用单引号,也可以用双引号
  13. 也可以使用转义字符
  14. \n (换行),
  15. \r (回车),
  16. \t (横向制表),
  17. \v (纵向制表),
  18. \’ (反斜杠),
  19. \” (双引号),
  20. 以及 \” (单引号)等等
  21. 下面的四种方式定义了完全相同的字符串(其中的两个中括号可以用于定义有换行的字符串)
  22. a = 'alo\n123"'
  23. a = "alo\n123\""
  24. a = '\97lo\10\04923"'
  25. a = [[alo123"]]
  26. 空值
  27. C语言中的NULL在Lua中是nil,比如你访问一个没有声明过的变量,就是nil
  28. 布尔类型
  29. 只有nil和false
  30. 数字0,‘’空字符串(’\0’)都是true

作用域

  1. lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里。
  2. 变量前加local关键字的是局部变量。

控制语句

  1. while循环
  2. local i = 0
  3. local max = 10
  4. while i <= max do
  5. print(i)
  6. i = i +1
  7. end
  8. if-else
  9. local function main()
  10. local age = 140
  11. local sex = 'Male'
  12. if age == 40 and sex =="Male" then
  13. print(" 男人四十一枝花 ")
  14. elseif age > 60 and sex ~="Female" then
  15. print("old man without country!")
  16. elseif age < 20 then
  17. io.write("too young, too naive!\n")
  18. else
  19. print("Your age is "..age)
  20. end
  21. end
  22. -- 调用
  23. main()
  24. for循环
  25. sum = 0
  26. for i = 100, 1, -2 do
  27. sum = sum + i
  28. end

函数

  1. 1.
  2. function myPower(x,y)
  3. return y+x
  4. end
  5. power2 = myPower(2,3)
  6. print(power2)
  7. 2.
  8. function newCounter()
  9. local i = 0
  10. return function() -- anonymous function
  11. i = i + 1
  12. return i
  13. end
  14. end
  15. c1 = newCounter()
  16. print(c1()) --> 1
  17. print(c1()) --> 2
  18. print(c1())

返回值

  1. name, age,bGay = "yiming", 37, false, "yimingl@hotmail.com"
  2. print(name,age,bGay)
  3. function isMyGirl(name)
  4. return name == 'xiao6' , name
  5. end
  6. local bol,name = isMyGirl('xiao6')
  7. print(name,bol)

Table

  1. keyvalue的键值对 类似 map
  2. lucy = {name='xiao6',age=18,height=165.5}
  3. xiao6.age=35
  4. print(xiao6.name,xiao6.age,xiao6.height)
  5. print(xiao6)

数组

  1. arr = {"string", 100, "xiao6",function() print("memeda") return 1 end}
  2. print(arr[4]())

遍历

  1. for k, v in pairs(arr) do
  2. print(k, v)
  3. end

面向对象

成员函数

  1. person = {name='xiao6',age = 18}
  2. function person.eat(food)
  3. print(person.name .." eating "..food)
  4. end
  5. person.eat("xxoo")