Lua是动态类型语言,变量不要类型定义。
数据类型
数据类型 | 描述 |
---|---|
nil | 空(在条件表达式中相当于false) |
Boolean | 布尔值:true / false |
number | 浮点数(Lua中整数浮点数不做区分) |
string | 字符串(Lua中字符字符串通用string) |
function | 由C或Lua编写的函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线程,用于执行协同程序 |
table | 表,关联数组,数组的索引可以是数字,字符串或表类型,在Lua中,table的创建是通过“构建表达式”来完成,最简单构造表达式是{},用来创建一个空表。 |
userdata 跟C语言挂钩。
thread 相当于Unity中的携程。
print("Hello World")
输出,末尾不用添加;
,添加了也是不会错的。
给变量赋不同类型
-- 当前a的类型为number
a = 10;
-- 重新赋值a的类型为string
a = "小明"
算数运算符
下列列出Lua语言中的常用的算术运算符,假设A的值为10,B的值为20:
操作符 | 描述 | 实例 |
---|---|---|
+ | 加法 | A+B输出结果30(若是加号两边不能转换成number类型则无法相加) |
- | 减法 | A-B输出结果-10 |
* | 乘法 | A*B输出结果200 |
/ | 除法 | B/A输出结果2 |
% | 取余 | B%A输出结果0 |
^ | 乘幂 | A^2输出结果100 |
- | 负号 | -A输出结果-10 |
关系运算符
下列为Lua语言中的常用的关系运算符,设定A的值为10,B的值为20:
操作符 | 描述 | 实例 |
---|---|---|
== | 等于,检测两个值是否相等,相等返回true,否则返回false | (A==B)为false |
~= | 不等于,检测两个值是否相等,不相等返回true,否则返回false | (A~=B)为true |
> | 大于,如果左边的值大于右边的值,返回true,否则返回false | (A>B)为false |
< | 小于,如果右边的值大于左边的值,返回true,否则返回false | (A<B)为true |
>= | 大于等于,如果左边的值大于等于右边的值,返回true,否则返回false | (A>=B)为false |
<= | 小于等于,如果左边的值小于等于右边的值,返回true,否则返回false | (A<=B)为true |
逻辑运算符
下列为Lua语言中的常用逻辑运算符,设定A的值为true,B的值为false
操作符 | 描述 | 实例 |
---|---|---|
and | and两边条件都为true,则返回true,否则返回false | (A and B)为false |
or | or两边条件都为false,则返回false,否则返回true | (A or B)为true |
not | 如果条件为true,逻辑非为false | not(A and B)为true |
if...else语句
if
和elseif
后面一定要加关键字then
a = 100
if a > 90 then
print("A")
elseif a > 80 then
print("B")
else
print("C")
end
注意:Lua中0为true,C#中0为false。
循环
while循环
a = 0
while a < 10 do
print(a)
a = a + 1
end
数值for循环
for i = 1, 10, 1 do
print("Hello World")
end
repeat...until
和C#中的do...while()类似,但do...while()是条件不符合跳出,repeat..until是符合条件跳出。
a = 0
repeat
print(a);
a = a + 1
until a > 10
C#和Lua用法区别
语言风格 | OOP面向对象型语言 | OP面向过程 function函数式编程 |
---|---|---|
强语言 | 弱语言 | |
基本数据类型 | 整数、浮点数、布尔、字符、字符串 | number数字、booleam布尔、string字符串 |
空类型 | null | nil |
定义类型 | int a = 10; 声明变量时需要定义类型 |
a = 10 不需要定义类型 |
全局变量 | static bool a = true; 类型前需要添加static 关键词 |
a = 10 就是全局变量,local a = 10 添加local 就变成局部变量 |
数据交换 | 数据交换时需要定义中间量临时存储 | a,b = 10,20 a,b = b,a 不需要定义中间量 |
运算符 + | 数据相加,字符串连接 | 代表数字运算(加号左右两边必须是number类型或者可以转换成number类型,否则就会报错) |
运算符 .. | 没有 | 用于字符串的连接 |
运算符^ | Math.power(基数,指数) |
2^2 |
运算符+=、-=、*=、/=、%= |
有 | 没有 |
运算符不等于 | != |
~= |
逻辑运算符 | `&&、 | |
运算符# | 没有 | 求字符串或表的长度(所占内存长度) |
控制流程 | `if...else if...else... | if...then elseif...then else end |
循环 | for、do while、while |
for、while、repeat..until |
函数方法 | 访问修饰符 返回值 方法名(参数定义){方法体} | function 方法名(参数定义) 方法体 end |
Lua方法类型
-- 没有返回值没有参数
function Do1()
end
-- 有参数没有返回值(因为Lua不需要定义数据类型,故可以传任何数值)
function Do2(a,b)
end
-- 有参数有返回值
function Do3(a,b)
return a+b;
end
-- 多返回值
function Do4(a,b)
return a+b, a-b, a*b, a/b
end
-- 可以使用多个参数进行承接
local a,b,c,d =Do4(1,2)
Lua方法传递
使用方法一:
function Do(a, b)
return a + b
end
-- 方法也是可以传递
t = Do
print(t(2, 3))
使用方法二:
function Do(f)
if f~=nil then
f();
end
end
-- 方法作为参数进行传递(匿名方法)
Do(function ()
print("lll")
end)
可变参数
三个点表示可变参数
function Do(...)
-- 使用局部变量接住可变参数
local args = {...}
-- select 传入可变参数的数量
print(select("#",...))
-- 从第二位开始输出后面的数值
print(select(2,...))
for key, value in pairs(args) do
print(value);
end
end
-- 方法执行
Do(1,3,5)
table 表
table是lua的一种数据结构,用来帮助我们创建不同的数据类型,如:数组,字典等。
可以使用任意的数值做数组的索引,但是不能为nil。
大小不是固定的,根据自己的需要进行扩容。
mytable = {}
创建一个空表
pairs
批量输出所有的数据(包含数组和字典)
ipairs
只能遍历连续的数组结构部分,若数组第七位数据是没有数据的,那么遍历到第六位就会停止。
table数组长度动态扩容
table表中数组数据扩容是以2的倍数进行的。
若当前数组的容量是4的话,若向第5个位置添加元素数据,但若是前四个位置是有空位,便不会进行扩容,而是作为键值对进行存储,若是前四个位置都是有数据的,没有空位,数组将会扩容,数据将存储到数组的第五个格子的位置。
-- 初始化表中数据
local mytable = {"zhang_san", "li_si", "wang_wu",teacher = "xiao_zhao"}
-- 访问数组数据
print(mytable[1])
-- 访问键值对
print(mytable["teacher"])
-- 访问键值对
print(mytable.teacher)
-- 数组添加
mytable[4] = "youyou"
-- 添加键值对
mytable.adivser = "kong_sha_sha"
-- 表中数据删除
mytable.teacher = nil
-- 获得数组长度(连续数组)
print(#mytable)
-- 遍历表中所有的数据(数组顺序输出,键值对无无序输出)
for key, value in pairs(mytable) do
print(key..value);
end
-- 遍历数组结构部分
for index, value in ipairs(mytable) do
print(value)
end
使用表来承接方法的多返回值
function Do(a, b)
return a+b,a-b,a*b,a/b
end
-- 多返回值可以使用表来承接
local args = {Do(1, 2)}
for key, value in pairs(args) do
print(key,value)
end
table的索引是从1开始的。
表中数据插入
local t = {"ping_guo", "xiang_jiao"}
-- 向表t中添加字符串 "ju_zi"
table.insert(t, "ju_zi")
-- 插入到表中指定位置,当前位置的元素向后移
table.insert(t, 1, "ming_meng")
表中指定数据删除
local t = {"ping_guo", "xiang_jiao"}
-- 移除表中最后一个元素
table.remove(t)
-- 根据索引删除表中数据
table.remove(t,1)
Lua模块
模块类类似一个封装库
定义一个mylib.lua脚本
-- 定义一个mylib的模块
mylib = {}
-- 这是模块中的一个变量
mylib.name = "llll"
-- 返回当前模块
return mylib
引用模块
-- 引入mylib模块,和C#中使用using类似
require("mylib")
-- 使用mylib中定义的数据
print(mylib.name)
:. self三者的区别
t = {money = 10000}
-- 静态方法
function t.Hua_Qian(t)
t.money = t.money -100
end
-- 成员方法
function t:Hua_Qian()
self.money = self.money -100
end
-- 静态方法调用
t.Hua_Qian(t)
-- 成员方法调用
t:Hua_Qian()
print(t.money)
.相当于静态方法,可以多个表共同使用一个
:相当于成员方法,只供本表进行使用
self和this相当,相当于是当前表
:使用频率较多。
闭包
当方法执行完毕后方法内存的变量没有销毁,就形成了闭包。
如:通过for循环动态创建点击按钮,并且在在创建的时候给按钮添加的事件或着数据,并不会随着方法执行完毕而销毁。
使用闭包实现ipairs迭代器
local t = {1,2,3,4}
local function mpairs()
local index = 0
return function ()
index = index + 1
return t[index]
end
end
for value in mpairs() do
print(value)
end
元表
元表是允许针对当前表的行为进行修改,具体改什么依赖元表中的元方法
通过表实现两个vector3相加
v = {x = 1,y = 2,z = 3}
p = {x = 4,y = 5,z = 6}
-- 给其中一个表添加元表(两个表相加,改变其中一个表即可)
setmetatable(v,{
__add = function (a,b)
local q = {}
q.x = a.x + b.x
q.y = a.y + b.y
q.z = a.z + b.z
return q
end
})
local g = v + p
print(g.x,g.y,g.z)
__index 最常用的元方法
若果是方法的话,先找原始表中是否有这个键,元方法有这个键就返回这个键对应的值,这个键不存在就找对应的元方法__index,如果元方法是一个方法,调用这个方法,返回这个方法的返回值,如果不是方法是一个表的话,返回另一个表中去查。
local t = {name = "gg"}
local v = {age = 10}
setmetatable(t,{
__index = v
})
print(t.age)
标签:基本,function,end,--,语法,Lua,print,false,true
From: https://www.cnblogs.com/wuzhongke/p/16931911.html