Lua

本文详细介绍Lua语言的基础知识,包括变量类型、流程控制、函数定义与调用、表和字符串操作等核心内容。适合初学者快速入门。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码 简单易懂

-- 是lua中的注释 相当于 // 
字符串:
1. 单引号表示的字符串里可包含双引号 但内部不能包含单引号
2. 双引号表示的字符串里可以包含单引号 但内部不能包含双引号
-- print("lua") 
-- a = 1
-- b = 2
-- print(a+b) -- 3 

-- b = false
-- n = 1
-- s = 'lua'
-- print(type(b)) -- type()类型 在代码后面注释的是这一句的输出结果 输出boolean
-- print(type(n)) -- number
-- print(type(s)) -- string

-- gVar = 10 -- 全局变量 没有local关键字的变量都是全局变量 命名规范全局加g
-- local var2 = 1 -- 局部变量
-- print(gVar,var2)

-- do   -- do...end 相当于{}代码块
--  local name = 'fool'
--  gAge = 5
--  print(name,gAge) -- fool 5
-- end
-- print(name,gAge) -- nil 5

-- x = 1
-- y = 2
-- z = x
-- x = y 
-- y = z
-- print(x,y) --交换值

-- x,y = y,x 
-- print(x,y) --也可以这样写

-- x = 1 
-- y = x..1
-- print(y) -- 11 数字拼接

-- str = 'hello'
-- str2 = 'lua'
-- print(str..str2) --hellolua 字符串拼接

-- print(#str2) -- 3 长度

-- ^ 优先级最高 -- a^b计算的就是a的b次方 x^0.5将计算x的算术平方根, x^(-1/3)将计算x立方根的倒数
-- not 
-- * /
-- + - 
-- ..
-- < > <= >= ~= ==     -- ~= 就是 !=
-- and  -- 逻辑非操作符。与逻辑运算结果相反 如果条件为 true 逻辑非为 false-- or 优先级最低


-- x^y^z ==> (y^z)^z 特例  从右往左计算

-- "%"(取模):和有的语言的%不一样,a % b == a - floor(a/b)*b 。floor(x) 表示对x向下取整 可以看出来表达式的符号永远和b的符号相同。
-- 如果a,b都是整数,%既是求余,这是好理解的。
-- 如果a,b中存在实数呢?
-- 其实,a,b都为实数计算a%b的大多数情况下都是没有实用价值的。
-- 但是特别的,当x为实数的时候:x-x%1就是计算x的整数部分
-- 类似的,x-x%0.01就是计算x精确到小数点后两位的结果

-- 单分支
-- if..
-- if a == nil then
--  print('条件成立')
-- end

-- 双分支
-- if a ~= nil then
--  print('条件成立')
-- else
--  print('条件不成立')
-- end

--[=[
1111111
222
多行注释
]=]--

-- x,y = 1,2
-- if x>y then
--  print('x>y')
-- else
--  print('x<y')
-- end

-- a = 0
-- while a<10
--  do
--  print('hello lua')
--  a = a + 1
-- end

-- sum,a = 0,1
-- while a<=100
--  do
--  sum = sum + a
--  a = a+1
-- end
-- print(sum)

-- sum,a = 0,1
-- while a<=100
--  do
--  if a % 2 == 0 then
--      sum = sum + a
--  end 
--  a = a+1
-- end
-- print(sum)

-- sum,a = 0,1
-- while a<=100
--  do
--  if a % 2 == 0 then
--      sum = sum + a
--      if sum >= 1500 then
--          print(a-2)
--          print(sum-a)
--          break
--      end
--  end 
--  a = a+1
-- end

-- 默认步长为1
-- var从exp1变化到exp2,每次变化都是以exp3作为步长(step)递增var,并执行一次循环体。
-- 不过第三个表达式exp3是可选的 若不指定的话 lua就会将步长默认为1-- 不过值得注意的是:在lua中 var 作为控制变量是被 lua 封装起来了 也就是说在循环体里面对 var 的修改都是无效的。
-- for i=1,10 do
--  print(i)
-- end

-- break return 跟其他语言差不多
-- for i=1,math.huge do
--  print(i)
--  if i>=100 then
--      break
--  end
-- end

-- Lua的基础库提供了ipairs 这是一个用于遍历数组的迭代器函数
-- 在每次循环中 i会被赋予一个索引值 同时v被赋予一个对应该索引值得数组元素值 
-- 通过从外观上看泛型for比较简单 但其实它是非常强大的 
-- 通过不同的迭代器,几乎可以遍历所有东西
-- 而且写出来的代码是极具可读性 标准库提供了几种迭代器 包括用于迭代文件中的每行的( io.lines() )  
-- 迭代table元素的( pairs() ) ... 迭代数组元素的( ipairs() ) ...迭代字符串中单词的( string.gmatch() )等等

-- a = {5,7,3,8,1}
-- for i,v in ipairs(a) do
--  io.write(v,' ') -- 5 7 3 8 1
-- end

-- 函数
-- function F(x)
--  print(x)
-- end
-- F(10)

-- print 'hello lua'

-- function Compare(num1,num2)
    -- if num1>num2 then
    --  return num1
    -- else
    --  return num2
    -- end
--  return num1>num2 and num1 or num2
--  -- ==> x > y ? x : y
-- end

-- max = Compare(12,11)
-- print(max)

-- function Calculate(num1,num2)
--  return num1+num2,num1-num2,num1*num2,num1/num2  
-- end
-- v1,v2,v3,v4 = Calculate(10,10)
-- print(v1,v2,v3,v4)

-- f = function (  )
--  print('这是一个函数变量声明的函数')
-- end
-- f()

-- function MyFunc( f )
--  f()
-- end

-- v = function (  )
--  print('这是一个函数')
-- end

-- MyFunc(v)

--  如果函数作为一条单独的语句 lua会丢弃所有的返回值 
-- function Calculate(num1,num2)
--  return num1+num2,num1-num2,num1*num2,num1/num2  
-- end
-- Calculate(10,10)

-- 如果函数作为表达式的一部分来调用时
-- lua只保留函数的第一个返回值
-- 只有当一个函数调用是一系列表达式中的最后一个元素时
-- 才能获得它所有的返回值
-- 这里的一系列表达式在lua中表现4中情况
-- 1> 多重赋值 2> 函数调用时传入参数列表
-- 3> table表达式  4>return语句

-- function F0(  ) end
-- function F1( ) return 'a' end
-- function F2( ) return 'a' ,'b' end

-- 1. 若一个函数调用是最后一个表达式的时候 
--    lua会保留尽可能多的返回值 用于匹配变量

-- x,y = F2()
-- print(x,y) -- a b
-- x = F2()
-- print(x) -- a
-- x,y,z = 10,F2()
-- print(x,y,z) -- 10 a b
-- x,y,z = F2(),10
-- print(x,y,z) -- a 10 nil

-- 2.  如果一个函数没有返回值 或没有返回足够多的值
--     那么lua会用nil来补位
-- x,y = F0()
-- print(x,y) -- nil nil
-- x,y = F1()
-- print(x,y) -- a nil

-- 3. 如果一个函数调用不是一系列表达式的最后一个元素
--    那么只产生一个值
-- x,y = F2(),10
-- print(x,y) -- a 10

-- x,y = F0(),20,30
-- print(x,y) -- nil 20 值列表大于变量列表 30被舍弃

-- x,y = F0(),F1()
-- print(x,y) -- nil a 

-- 4. 当一个函数调用作为另一个函数的最后一个(或仅有)的实参时
--    第一个函数的所有返回值都将作为实参传入第二个函数

-- print(F0()) -- 空 不是nil
-- print(F1()) -- a 
-- print(F2()) -- a b
-- print(F2(),1) -- a 1  符合<3>

-- 变长参数 ... 
-- function Add( ...  )
--  local arg = {...}  -- 表结构
--  sum  = 0
--  for i=1,#arg do
--      sum = sum + arg[i]
--  end
--  return sum
-- end
-- print(Add(10,10,10))


-- function Test( ... )
--  length = select("#",...) -- 得到所有参数的长度
--  print(length) 
--  for i=1,length do
--  array = select(i,...) -- 得到第i个参数
--  print(array) 
--  end
-- end
-- Test("测试",2) -- 运行结果 length = 2 array 输出了 aa111 2


-- table表
mytable = {}
-- 通过mytable[key] 方法可以对表中的数据查找或修改
mytable["name"] = "wp"
mytable["age"] = 80
print(mytable["name"],mytable["age"],mytable["money"]) -- wp 80 nil
mytable["name"] = "pw"
print(mytable["name"],mytable["age"],mytable["money"]) -- pw 80 nil
-- 如果对于没有赋值的key其值为nil

mytable.age = 79;
print(mytable.age) -- 79

-- repeat <循环体> until <判断>
value = 1
repeat
    io.write(value," ")
    value = value + 1
until value == 10 --  1 2 3 4 5 6 7 8 9

– 字符串处理
– 1.字符转数字

-- myStr = "1234"
-- myNum = tonumber(myStr) -- int.Parse
-- print(myNum)

– 2.数字转换成字符串

-- myNum = 123
-- myStr = tostring(myNum)
-- print(myStr,type(myStr))

– 3.返回指定的字符串

-- myStr = "hellolua"
-- newStr = string.sub(myStr,2,5) -- ello 参数1 要截取的字符串 参数2 从第几个  参数3 截取到几 无参数3 就从参数2开始截取剩下的全部
-- print(newStr)

– 4.从字符串的尾部开始截取

-- myStr = "hellolua"
-- newStr = string.sub(myStr,-3) -- lua倒着截
-- print(newStr)
-- url = "www.kengni.com?"
-- www = url.."username='admin'&&userpsd = '123'"
-- params = string.sub(www,-(#www - #url))
-- print(params)

– 5.格式化字符串 – %s: 与空白字符配对

-- str = string.format("%s%s%s",url,www,2)
-- print(str)
-- print("\\f")

– 6.string.gsub 函数有三个参数:目标串,模式串,替换串。
– 基本作用是用来查找匹配模式的串,并将使用替换串其替换掉– :

-- s = string.gsub("Lua is good", "good", "bad?") 
-- print(s)   -- Lua is bad?
-- pai = 3.1415926
-- print(string.format('%.2f',pai)) -- 3.14

– 一个中文字符在lua中占3个字节

-- myStr = "字符串"
-- sIndex,endIndex = string.find(myStr,'串')
-- print(sIndex,endIndex) -- 7 9 
- myStr = "字符串查找a11.00"
-- pattern = "%a%d%d.%d%d"
-- sIndex,endIndex = string.find(myStr,pattern)
-- print(string.sub(myStr,sIndex,endIndex)) -- 找110

– “%”(取模):和有的语言的%不一样,a % b == a - floor(a/b)*b 。floor(x) 表示对x向下取整 可以看出来表达式的符号永远和b的符号相同。
– 如果a,b都是整数,%既是求余,这是好理解的。
– 如果a,b中存在实数呢?
– 其实,a,b都为实数计算a%b的大多数情况下都是没有实用价值的。
– 但是特别的,当x为实数的时候:x-x%1就是计算x的整数部分
– 类似的,x-x%0.01就是计算x精确到小数点后两位的结果

– 模式串
– . 任意字符
– %a 字母
– %c 控制字符
– %d 数字
– %l 小写字母
– %p 标点字符
– %s 空白符
– %u 大写字母
– %w 字母和数字
– %x 十六进制数字
– %z 代表 0的字符

– 特殊字符如下:
– (). % + - * ? [ ^ $
– % 也作为以上特殊字符的转义字符。

– 字符加数字
– 查找特殊符号

-- str = "#哈哈#,@#¥12"
-- pattern ="#"
-- sIndex,endIndex = string.find(str,pattern)
-- print(sIndex,endIndex)
-- count = 0
-- for jinghao in string.gmatch(str,pattern) do
--  print(jinghao)
--  print("#出现了",(count + 1).."次")
-- end

– [] 该方框作为匹配该范围的集合
– 如[0-9] 则匹配0到9的数字范围
– Lua 中的模式修饰符有四个:
– + 匹配前一字符 1 次或多次,最长匹配
– * 匹配前一字符 0 次或多次,最长匹配
– - 匹配前一字符 0 次或多次,最短匹配
– ? 匹配前一字符 0 次或 1次
– ‘+’,匹配一个或多个字符,总是进行最长的匹配。
– 模式 ‘%a+’ 匹配一个或多个字母或者一个单词
– 如:匹配c中的注释串
– 用 ‘/%.%/’ 和’/%.-%*/’

-- myStr = "#qwe11#wocao#"
-- pattern = "#[^%s+]-#"
-- for var in string.gmatch(myStr,pattern) do
--  print(var)
-- end
-- str = "int x; /*x*/  int y; /* y */" 
-- print("/%*.*%*/")
-- print(string.gsub(str, "/%*.*%*/", "<注释串>"),"wea") 
-- str22 = "woshinibabanini"
-- print(string.gsub(str22,"ni","nide"))
-- str33 = string.gsub(str22,"ni","nide")
-- print(str33)

–> int x; <注释串>
–采用 ‘.-’ 则为最短匹配,即匹配 “/” 开始到第一个 “/” 之前的部分:

-- str = "int x; /* x */  int y; /* y */" 
-- print(string.gsub(str, "/%*.-%*/", "<注释部分>")) 

–> int x; <注释串> int y; <注释串>

– 数组

-- array = {}
-- for i=-2,10 do
--  array[i] = i+1
-- end
-- print(array[-1])

– 迭代器

-- function Values( t )
--  local i = 0i
--  return function (  )
--      i = i+1
--  return t[i]
-- end
-- end

– – 定义一个测试数组

-- array = {10,20,30}
-- -- 采用自定义迭代器的方式返回数组
-- iter = Values(array)
-- while true do 
--  local element = iter()
--  if element == nil then break end
--  print(element)
-- end

– for循环 1.传统for循环 数值for循环
– 2.泛型for循环
– ipairs
– pairs

-- t  = {["name"]="lua",["age"] = 18,188}
-- for _,v in ipairs(t) do
--  print(v)
-- end

– 不是按顺序的 按key的哈希值

-- for _,v in pairs(t) do
--  print(v)
-- end

– 情况1:表结构实现的是数组 此时2中迭代器没区别

-- t = {1,2,3,4}
-- for i,v in ipairs(t) do
--  print(i,v)
-- end

-- for k,v in pairs(t) do
--  print(k,v)
-- end

– 情况2:表结构为哈希表/字典 对应c#中HashTable Dictionary

-- t = {
--  ["name"] = "lua",
--  ["age"] = 18
-- }

-- for i,v in ipairs(t) do 
--  print(i,v) -- 无输出
-- end

-- for i,v in pairs(t) do
--  print(i,v) -- age 18 name lua
-- end

-- t = {
--  ["name"] = "lua",
--  ["age"] = 18,
--  [1] = "lua1",
--  [2] = "lua2"
-- }

-- for i,v in ipairs(t) do
--  print(i,v) -- 1 lua1    2 lua2
-- end

– key为整数,但是不连续

t ={
    [1] = "a",
    [2] = "b",
    [3] = "d"   
}
-- for i,v in ipairs(t) do 
--  print(i,v) -- 1 1 2 2
-- end
for i,v in pairs(t) do
    print(i,v) -- 2 2 1 1 4 4
end

– 混合情况 混合的表结构

t = {
    1,
    2,
    3,
    [1] = 222,
    ["name"] = "lua",
    [2] = 333
}

-- -- for i,v in ipairs(t) do 
-- --   print(i,v) -- 部分输出 只能输出连续的索引
-- -- end
-- for i,v in pairs(t) do
--  print(i,v) 
-- --   1   1
-- --   2   2
-- --   3   3 
-- --  name lua 
-- end

– concat 连接函数

-- t1 = {"laowang","and","laozhang",1,2,["key"] = "value"}
-- print(table.concat(t1),type(table.concat(t1))) 
-- -- laowangandlaozhang12 string

– insert 插入函数(相当于按下标插入)

--  t2 = {"ello","lua"}
--  var = table.insert(t2,1,"h") -- t1 = {"h","ello","lua"}
--  print(var) -- nil 没有返回值
--  print(t2[1]) -- h 
--  print(table.concat(t2)) -- hellolua

整理的比较乱 凑合看吧 0.0
有时间在整理整理
附lua学习网站:http://www.runoob.com/lua/lua-tutorial.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值