ToB企服应用市场:ToB评测及商务社交产业平台

标题: lua~基本语法 [打印本页]

作者: 小小小幸运    时间: 2024-5-19 19:31
标题: lua~基本语法
学习 Lua 的须要性

语言特点

注释

  1.     -- 注释内容
复制代码
  1.     --[[
  2.     注释内容
  3.     ]]--
复制代码
内置数据类型

总共有6种内置数据类型, 其中包罗nil, boolean, number, string, table, function
nil

通常是没有赋值,直接利用才会是这个值, 比如说下面的代码直接打印变量name lua print(name), 在 ifelse 判断语句中,nil 被当成false 分支,但 nil ~= false, 在 Lua 语言当中,不即是利用 ~= 来表示, 而不是我们常见的 != 。
boolean

有两种取值:true, false
number

全部的数值类型都利用 number 来表示,不管是整数,照旧浮点数,实在内部的存储方式是双精度类型。
string

字符串可以用双引号,也可以用单引号包围起来,特殊字符需要转义
  1. name = "dev4mobile"
  2. name = 'dev4mobile'
  3. nameWithAge = 'dev4mobile \n 25'
  4. # 多行字符串
  5. welcome = [[
  6. hello world
  7. ]]
复制代码
table

实在就是其它语言内里的对象, 有两种表现方式,一种是数组,一种是字典(Map),都是利用大括号括起来的。记住数组索引从1开始。
  1. arr = { 1, "dev4mobile", 'cn.dev4mobile@gamil.com', 12.3, function()endv}
  2. person = { name = 'dev4mobile' }
复制代码
function

定义如下,以 function关键字作为开头,add 是函数名字
  1. -- 一般定义
  2. function add(a, b)
  3. return a + b
  4. end
  5. -- 传递多个参数
  6. function dd(...)
  7.     local args = {...}
  8.     for i, v in ipairs(args) do
  9.         print("参数", i, ":", v)
  10.     end
  11. end
  12. -- 返回多个参数
  13. function res()
  14.     return "abc", 12, function() end
  15. end
  16. local value1, value2, value3 = res()
复制代码
控制流语句

循环

循环有3种写法,for, while,repeat .. until
说明: #变量名 表示读取变量的长度,可以是字符串和数组
  1. -- for 循环
  2. arr = { 1, 2, 3, 4, 5 }
  3. for i=1, #arr do -- 索引从1开始
  4. print(arr[i])
  5. end
  6. -- while 循环
  7. arr = { 1, 2, 3, 4, 5 }
  8. i = 1
  9. while i <= #arr do
  10. print(arr[i])
  11. i = i + 1
  12. end
  13. -- repeate until 循环
  14. arr = { 1, 2, 3, 4, 5 }
  15. i = 1
  16. repeat
  17. print(arr[i])
  18. i = i + 1
  19. until i >= #arr
复制代码
分支 ( ifelse )
  1. name = "dev4mobile"
  2. if #name > 10 then
  3. print("name length = ".. #name)
  4. elseif #name >5 then
  5. print("name length > 5, real length = "..#name) -- 两个点..代表字符串
  6. else
  7. print("name length < "..#name)
  8. end
复制代码
面向对象

实现原理:有点类似 JavaScript 的实现利用原型方式,利用函数 + table 实现。
模块

在写demo之前有须要先介绍下模块的概念,一般来说一个文件就是一个模块,跟 JavaScript 一样, 导入模块关键字 require, 导出模块关键字return
下面我们来新建一个模块名,首先新建一个文件名: perosn.lua,输入下面代码
  1. -- 定义模块
  2. -- 解释器
  3. #!/usr/local/bin/lua
  4. local Person = {}
  5. -- 导出模块名,类似JavaScript中的export
  6. return Person
  7. -- 导入模块
  8. -- 解释器
  9. #!/usr/local/bin/lua
  10. local perosn = require('person')
复制代码
构造对象

首先新建一个文件名: perosn.lua,输入下面代码
  1. -- 定义模块
  2. -- 解释器
  3. #!/usr/local/bin/lua
  4. local Person = {}
  5. -- 定义构造函数
  6. function Person:new(name, age)
  7. -- __index 指向 父类 table
  8. -- setmetatable 关联了 新创建的对象 { name = name, age = age } 与 Person 对象
  9. return setmetatable({ name = name, age = age }, { __index = Person })
  10. end
  11. function Person:toString()
  12. print('name='..self.name..', age='..self.age)
  13. end
  14. -- 导出模块名,类似JavaScript中的export
  15. return Person
  16. -- 导入模块
  17. -- 解释器
  18. #!/usr/local/bin/lua
  19. local Perosn = require('person')
  20. -- 调用构造函数
  21. local person = Person:new("dev4mobile", 21)
  22. -- 调用对象的toString方法, 这个方法是父类方法,需要我们setmetatable来绑定,也就是我们定义对象时 setmetatable({ name = name, age = age }, { __index = Person }) 来绑定的
  23. person.toString()
复制代码
非常处理

在Lua中是支持非常处理的。Lua提供了pcall函数来捕获函数执行过程中可能抛出的错误。下面是一个简单的示例:
  1. function divide(a, b)
  2.     if b == 0 then
  3.         error("除数不能为0")
  4.     end
  5.     return a / b
  6. end
  7. local status, result = pcall(divide, 10, 0)
  8. if status then
  9.     print("结果:", result)
  10. else
  11.     print("发生错误:", result)
  12. end
复制代码
在上面的例子中,我们定义了一个divide函数用于进行除法运算,如果除数为0,则会通过error函数抛出一个错误。然后我们利用pcall来调用divide函数,如果函数执行乐成,pcall返回true和函数的返回值;如果函数执行过程中有错误,pcall返回false和错误信息。通过判断pcall的返回值,我们可以进行相应的非常处理。
冒号(:)和点号(.)的区别

在Lua中,利用冒号(:)和点号(.)的区别在于函数定义时是否将self作为第一个参数传入。
下面是代码示例:
  1. local Person = {}
  2. function Person:new(name, age)
  3.     local obj = {}
  4.     obj.name = name
  5.     obj.age = age
  6.     function obj:sayName()
  7.         print("My name is " .. self.name)
  8.     end
  9.     return obj
  10. end
  11. function Person.old(self, name, age)
  12.     self.name = name
  13.     self.age = age
  14.     function self.sayName()
  15.         print("My name is " .. self.name)
  16.     end
  17. end
  18. -- 使用冒号调用new方法
  19. local person1 = Person:new("Alice", 25)
  20. person1:sayName()
  21. -- 使用点号调用old方法
  22. local person2 = {}
  23. Person.old(person2, "Bob", 30)
  24. person2.sayName(person2)
复制代码
在上面的例子中,Person:new方法利用冒号定义,自动传入了self参数;而Person.old方法利用点号定义,需要手动传入self参数。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4