Lua 篇(二)— Lua 的基本语法和函数

一、Lua 的基本语法

1.注释

代码如下(示例):

-- 这是一行单行注释
--[[
这是一个
多行注释
]]

2.变量

代码如下(示例):

-- Lua 是一种动态类型的语言,变量不需要声明类型,可以直接赋值
-- 变量名可以由字母,数字,下划线组成,但不能以数字开头,也不能是 Lua 的保留字
-- Lua 有三种类型的变量:全局变量,局部变量,表的域

-- 全局变量是默认的变量类型,可以在任何地方访问,不需要声明,直接赋值即可
x = 10 -- x 是一个全局变量
print(x) -- 输出 10

-- 局部变量是在函数或者代码块中定义的变量,只在该范围内有效,需要使用 local 关键字声明
local y = 20 -- y 是一个局部变量
print(y) -- 输出 20

-- 表的域是指表中的一个键值对,表是 Lua 的唯一的数据结构,可以用来表示数组,字典,对象等
-- 表的域可以是全局的,也可以是局部的,取决于表本身是如何定义的
z = {} -- z 是一个全局变量,表示一个空表
z.a = 30 -- z.a 是一个全局的表的域,表示表 z 中的一个键值对,键为 a,值为 30
print(z.a) -- 输出 30

local w = {} -- w 是一个局部变量,表示一个空表
w.b = 40 -- w.b 是一个局部的表的域,表示表 w 中的一个键值对,键为 b,值为 40
print(w.b) -- 输出 40

3.数据类型

代码如下(示例):

-- Lua 支持以下几种数据类型:nil,boolean,number,string,function,userdata,thread,table
-- 可以使用 type 函数来检查一个值的类型

-- nil 表示空值,相当于其他语言的 null,nil 是 Lua 的保留字
print(type(nil)) -- 输出 nil

-- boolean 表示布尔值,只有两个值:true 和 false,它们都是 Lua 的保留字
-- Lua 把 false 和 nil 视为假,其他任何值都视为真
print(type(true)) -- 输出 boolean
print(type(false)) -- 输出 boolean

-- number 表示数字,Lua 默认使用双精度浮点数表示所有的数字,没有整数类型
-- 可以使用科学计数法或者十六进制表示数字
print(type(10)) -- 输出 number
print(type(3.14)) -- 输出 number
print(type(1e10)) -- 输出 number
print(type(0xff)) -- 输出 number

-- string 表示字符串,可以使用单引号或者双引号表示字符串
-- 可以使用 .. 连接两个字符串,可以使用 # 获取字符串的长度
-- 可以使用 [[]] 表示多行字符串,也可以用来表示正则表达式
print(type("Hello")) -- 输出 string
print(type('World')) -- 输出 string
print("Hello" .. "World") -- 输出 HelloWorld
print(#"Hello") -- 输出 5


-- function 表示函数,Lua 是一种函数式编程语言,函数可以作为值存储,传递,返回
-- 可以使用 function 关键字定义一个函数,也可以使用匿名函数
-- 函数的参数和返回值都可以是多个,使用逗号分隔
print(type(print)) -- 输出 function
print(type(type)) -- 输出 function
print(type(function() end)) -- 输出 function

-- userdata 表示一种用户自定义的数据,用来表示一种由应用程序或者 C 语言库所创建的类型
-- userdata 可以存储任意的 C 语言数据,Lua 无法直接操作它们,只能通过元表(metatable)来访问
--

4.控制结构

代码如下(示例):

-- Lua 支持以下几种控制结构:if,while,repeat,for,break,return,goto
-- 可以使用 end 关键字结束一个控制结构

-- if 用来进行条件判断,可以使用 elseif 和 else 分支,也可以使用 and,or,not 逻辑运算符
-- Lua 中没有 switch 语句,可以用 if 来模拟
local a = 10
local b = 20
if a > b then
  print("a is greater than b")
elseif a < b then
  print("a is less than b")
else
  print("a is equal to b")
end

-- while 用来进行循环,当条件为真时执行循环体,否则跳出循环
local i = 1
while i <= 10 do
  print(i)
  i = i + 1
end

-- repeat 用来进行循环,与 while 相反,当条件为假时执行循环体,否则跳出循环
-- repeat 相当于其他语言的 do-while
local j = 1
repeat
  print(j)
  j = j + 1
until j > 10

-- for 用来进行循环,有两种形式:数值 for 和泛型 for
-- 数值 for 用来遍历一个数字区间,有三个参数:初始值,终止值,步长
-- 泛型 for 用来遍历一个迭代器,可以是一个表,一个字符串,或者一个自定义的函数
for k = 1, 10, 2 do -- 从 1 到 10,每次增加 2
  print(k)
end

local t = {a = 1, b = 2, c = 3} -- 定义一个表
for key, value in pairs(t) do -- 遍历表中的键值对
  print(key, value)
end

local s = "Hello" -- 定义一个字符串
for char in string.gmatch(s, ".") do -- 遍历字符串中的字符
  print(char)
end

-- break 用来跳出循环,可以使用在 while,repeat,for 中
for l = 1, 10 do
  if l == 5 then
    break -- 当 l 等于 5 时,跳出循环
  end
  print(l)
end

-- return 用来从函数中返回值,可以返回多个值,使用逗号分隔
-- return 也可以用来跳出循环,相当于 break
function add(x, y) -- 定义一个函数,接受两个参数
  return x + y -- 返回两个参数的和
end

local m = 1
while true do
  m = m + 1
  if m == 10 then
    return m -- 当 m 等于 10 时,返回 m 并跳出循环
  end
end

-- goto 用来无条件地跳转到一个标签,标签由双冒号包围
-- goto 可以用来实现多重跳出循环,或者模拟 continue 语句
local n = 1
::start:: -- 定义一个标签
n = n + 1
if n < 10 then
  goto start -- 当 n 小于 10 时,跳转到 start 标签
end
print(n) -- 输出 10

二、Lua 的函数

1.函数定义

代码如下(示例):

-- Lua 中的函数是一种值,可以赋值给变量,也可以作为参数或返回值传递
-- 可以使用 function 关键字定义一个函数,也可以使用匿名函数
-- 函数的参数和返回值都可以是多个,使用逗号分隔

-- 定义一个名为 add 的函数,接受两个参数,返回它们的和
function add(x, y)
  return x + y
end

-- 定义一个匿名函数,接受一个参数,返回它的平方,然后赋值给变量 square
local square = function(x)
  return x * x
end

-- 定义一个名为 power 的函数,接受两个参数,返回第一个参数的第二个参数次方,使用匿名函数作为返回值
function power(x, y)
  return function()
    local result = 1
    for i = 1, y do
      result = result * x
    end
    return result
  end
end

2.函数调用

代码如下(示例):

-- 函数调用使用圆括号,可以传递多个参数,也可以接收多个返回值
-- 如果传递的参数多于函数定义的参数,多余的参数会被忽略
-- 如果传递的参数少于函数定义的参数,缺少的参数会被赋值为 nil
-- 如果接收的返回值多于函数返回的值,多余的返回值会被赋值为 nil
-- 如果接收的返回值少于函数返回的值,多余的返回值会被丢弃

-- 调用 add 函数,传递两个参数,接收一个返回值
local sum = add(10, 20) -- sum 为 30

-- 调用 square 函数,传递一个参数,接收一个返回值
local sq = square(5) -- sq 为 25

-- 调用 power 函数,传递两个参数,接收一个返回值,该返回值是一个函数
local pow = power(2, 3) -- pow 为一个函数

-- 调用 pow 函数,不传递参数,接收一个返回值
local result = pow() -- result 为 8

-- 定义一个名为 swap 的函数,接受两个参数,返回它们的交换值
function swap(x, y)
  return y, x
end

-- 调用 swap 函数,传递两个参数,接收两个返回值
local a, b = swap(1, 2) -- a 为 2,b 为 1

-- 调用 swap 函数,传递两个参数,接收一个返回值
local c = swap(3, 4) -- c 为 4,多余的返回值被丢弃

-- 调用 swap 函数,传递两个参数,接收三个返回值
local d, e, f = swap(5, 6) -- d 为 6,e 为 5,f 为 nil,缺少的返回值被赋值为 nil

3.变长参数

代码如下(示例):

-- Lua 支持变长参数,即函数可以接受任意个数的参数
-- 可以使用 ... 表示变长参数,也可以使用 table.pack 和 table.unpack 函数来操作变长参数

-- 定义一个名为 sum 的函数,接受变长参数,返回它们的和
function sum(...)
  local args = table.pack(...) -- 将变长参数打包成一个表
  local result = 0
  for i = 1, args.n do -- 遍历表中的所有参数
    result = result + args[i]
  end
  return result
end

-- 调用 sum 函数,传递任意个数的参数,接收一个返回值
local s1 = sum(1, 2, 3) -- s1 为 6
local s2 = sum(4, 5, 6, 7, 8) -- s2 为 30
local s3 = sum() -- s3 为 0

-- 定义一个名为 concat 的函数,接受变长参数,返回它们的连接
function concat(...)
  local args = {...} -- 将变长参数转换成一个表
  local result = ""
  for i, v in ipairs(args) do -- 遍历表中的所有参数
    result = result .. tostring(v) -- 将参数转换成字符串并连接
  end
  return result
end

-- 调用 concat 函数,传递任意个数的参数,接收一个返回值
local c

4.表(Table)

代码如下(示例):

-- 在 Lua 中,表(table)是唯一的数据结构,可以用来模拟数组,字典,集合等
-- 表使用 {} 来创建,可以包含任意类型的值,使用 [] 来访问元素

-- 创建一个空表
local t = {}

-- 使用数字索引创建一个数组
local array = {1, 2, 3, 4, 5}
print(array[1]) -- 输出 1

-- 使用字符串索引创建一个字典
local dict = {a = 1, b = 2, c = 3}
print(dict["a"]) -- 输出 1
print(dict.b) -- 输出 2,也可以使用 . 来访问

-- 使用表来模拟集合
local set = {apple = true, banana = false}
print(set["apple"]) -- 输出 true
print(set["banana"]) -- 输出 false

-- 表也可以包含函数,用来模拟对象的方法
local obj = {
  value = 0,
  add = function(self, x)
    self.value = self.value + x
  end
}
obj:add(5)
print(obj.value) -- 输出 5

5.模块和包

代码如下(示例):

-- Lua 支持模块和包,可以将代码组织成可重用的单元
-- 可以使用 require 函数来加载一个模块,模块可以是一个文件或者一个预编译的 C 语言库

-- 创建一个名为 mymodule 的 Lua 文件,内容如下
-- mymodule.lua
local M = {}

function M.add(x, y)
  return x + y
end

return M

-- 在另一个 Lua 文件中,使用 require 来加载 mymodule
local mymodule = require("mymodule")
print(mymodule.add(10, 20)) -- 输出 30

三、总结

Lua 是一种简单而强大的脚本语言,它的设计哲学是提供足够的功能来支持通用编程,同时保持小巧和易学。Lua 的表(table)是一个非常灵活的数据结构,可以用来实现各种复杂的数据模型。Lua 的函数支持高阶函数和闭包,使得函数式编程成为可能。Lua 的模块和包机制可以帮助我们更好地组织代码,提高代码的可维护性和可重用性。

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨染青枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值