老渔哥网站建设公司,找工程分包网站,网站建设生产或运营,代理公司代理注册流程Lua 基础相关知识 第一期
注释
-- 单行注释--[[多行注释
--]]-- 多加一个横杠符号就能重新启用注释内的代码
---[[print(Lua)
--]]数据类型
Lua 是动态类型语言#xff0c;变量不需要类型定义#xff0c;只需要为变量赋值。
Lua 有 8 种基本类型#xff1a…Lua 基础相关知识 第一期
注释
-- 单行注释--[[多行注释
--]]-- 多加一个横杠符号就能重新启用注释内的代码
---[[print(Lua)
--]]数据类型
Lua 是动态类型语言变量不需要类型定义只需要为变量赋值。
Lua 有 8 种基本类型
nil表示一个无效值条件表达式中表示 falsebooleanfalse 或 true0 也是 truenumber表示双精度类型的实浮点数string字符串由一对单引号或双引号包括也可以用两个方括号table表是一个关联数组数组的索引可以是数字、字符串或表类型function函数userdata表示任意存储在变量中的 C 语言数据结构thread表示执行的独立线程用于执行协同程序
可以使用 type() 函数查看数据类型。
print(type(nil)) -- nil
print(type(true)) -- boolean
print(type(1)) -- number
print(type(Lua)) -- string
print(type({})) -- table
print(type(print)) -- function布尔
false 或 true但需要注意Lua 把除了 false 和 nil 以外的值都视为 true例如 0 和 都是 true。
逻辑运算符 andornot 的使用
and如果第一个操作数为 false就返回第一个操作数否则返回第二个操作数。or如果第一个操作数为 true就返回第一个操作数否则返回第二个操作数。not取反。
and 和 or 都是短路求值只有在必要时才会计算第二个操作数。
常见的写法
a a or 0 -- 如果 a 不存在则使用默认值 0a x y and x or y -- 类似三目运算符但不完全是
-- 操作过程 ---- 若 x y 为 true则 ( x y and x ) 返回 x
-- 接着 x or y若 x 存在则为 true返回 x ( 如果此时 x 不存在或 false则返回 y这里是跟三目运算符的区别)-- 若 x y 为 false则 ( x y and x ) 返回 x y 的结果 false
-- 接着 false or y返回 ynot nil -- true
not false -- true
not true -- false
not 0 -- false字符串
在对一个数字字符串进行算术运算时Lua 会尝试将字符串转成数字。
其他语言例如 C#是把数字转成字符串进行连接这里要注意 Lua 的处理方式。
print(1 2) -- 3而连接字符串则使用 … 符号。
print(How .. are .. you) -- How are you计算字符串长度用 # 符号。
print(#hello) -- 5字符串可以使用两个方括号表示。
html [[
html
head/head
bodypLua/p
/body
/html
]]print(html)--[[ 打印结果也有换行html
head/head
bodypLua/p
/body
/html--]]如果字符串的内容也有两个方括号就会有语法错误此时可以在最外围的两对方括号中间添加 号。
html [[
html
head/head
bodypLua 这里多出的 ]] 会和 [[ 匹配后面的内容就不被包括在字符串内了/p
/body
/html
]]表
表可以看成是数组或哈希表取决于 key 值是从 1 开始的连续正整数还是其他类型。
如果没有指定 key 值默认就是数组。
不同于其他语言Lua 的数组索引是从 1 开始的。
table { a, b, c }
print(table[1]) -- a
print(table[2]) -- b
print(table[3]) -- c指定 key 值就变成了哈希表。可以使用 [] 或 . 的方式获取 value 值。
table {[name] Alice,[age] 18,
}
print(table[name]) -- Alice
print(table.age) -- 18需要注意的是如果直接给表赋值第三个位置的值那么前两个位置的值会自动填充为 nil。
table {[3] Alice,
}
print(table[1]) -- nil
print(table[2]) -- nil
print(table[3]) -- Alice计算表的长度也是用 # 符号前提是数组的形式哈希表不适用只能计算 key 值为连续正整数的部分。
table { a, b, c }
print(#table) -- 3table {[1] a,[3] c
}
print(#table) -- 1table {[1] a,[2] b, -- key 值为字符串[3] c
}print(#table) -- 1如果要判断表是否为空可以使用 next() 函数获取下一个键值对。
table {}
print(next(table) nil) -- truetable { a }
print(next(table) nil) -- false函数
函数使用 function 定义指定函数名和参数end 结尾。
function Add(a, b)return a b
endprint(Add(1, 2)) -- 3函数可以保存到变量中也可以保存到表中。
add function (a, b)return a b
end
print(add(1, 2)) -- 3table {[add] add
}
print(table[add](1, 2)) -- 3
print(table.add(1, 2)) -- 3变量
Lua 中声明变量默认是全局变量只有在变量前添加 local 关键字才是局部变量。
a 1 -- 全局变量
local b 2 -- 局部变量可以同时对多个变量进行赋值。
a, b 5, 6
print(a, b) -- 5 6赋值前Lua 会先计算右边的值再赋值所以可以简便地进行变量的交换。
a, b 5, 6
a, b b, a
print(a, b) -- 6 5当变量的个数和值的个数不同时Lua 会采取以下策略
变量的个数 值的个数补足 nil变量的个数 值的个数多余的值被忽略
a, b, c 0
print(a, b, c) -- 0 nil nila 0, 1, 2
print(a) -- 0分支循环
分支
分支结构如下每个 if 后面要接 then最后以 end 结尾。
local score 60
if score 60 thenprint(不及格)
elseif score 80 thenprint(及格)
elseif score 100 thenprint(优秀)
elseprint(超标)
end-- 及格循环
循环结构如下指定 i 的初始值、终止值、步长。
for i 1, 5, 1 doprint(i .. i)
end-- i 1
-- i 2
-- i 3
-- i 4
-- i 5遍历表
有三种方法遍历表常规的第一种如下
table { a, b, c }-- #table 获取 table 的长度
for i 1, #table, 1 doprint(table[i])
end-- a
-- b
-- c第二种是使用 pairs 方法
table { a, b, c }for key, value in pairs(table) doprint(key .. key .. value .. value)
end-- key 1 value a
-- key 2 value b
-- key 3 value c第三种是使用 ipairs 方法
table { a, b, c }for key, value in ipairs(table) doprint(key .. key .. value .. value)
end-- key 1 value a
-- key 2 value b
-- key 3 value cpairs 和 ipairs 的区别
pairs遍历所有键值对顺序随机可以返回 nil。
ipairs从 key 值为 1 开始顺序遍历key 值不连续则会停止不能返回 nil。
例 1表中有两个键值对缺失了 key 为 2 的值。
pairs 会遍历所有键值对ipairs 只会遍历第一个键值对因为找不到 key 为 2 的值就停止了。
table {[1] a,[3] c
}for key, value in pairs(table) doprint(key .. key .. value .. value)
end-- key 1 value a
-- key 3 value cfor key, value in ipairs(table) doprint(key .. key .. value .. value)
end-- key 1 value a例 2补上了一个键值对但是 key 值是字符串 2。
pairs 依然会遍历所有键值对但是顺序乱了。ipairs 依然只能遍历第一个键值对。
table {[1] a,[2] b, -- key 值为字符串[3] c
}for key, value in pairs(table) doprint(key .. key .. value .. value)
end-- key 3 value c
-- key 1 value a
-- key 2 value bfor key, value in ipairs(table) doprint(key .. key .. value .. value)
end-- key 1 value a