命名规则的不同
- 帕斯卡命名法主要是给类和方法命名,每个单词的首字母全部大写,其余小写
- 驼峰命名法主要是给变量命名的,首个单词全部小写,其余单词首字母大写,剩下小写
SciTE编辑器使用指南
- 必须要保存为.lua后缀文件
- 空白文件无法保存
- 保存之后才可以运行(按F5)
变量
- 在lua里面不需要给变量指定数据类型,根据存储的值来决定
- LUA不需要分号结尾
- number,数值类型,存储整数和小数
- boolean 布尔类型,只有true和false两个值
- string 字符串类型,双引号,单引号都可以,lua种无char类型
- 即使单个字符,type也会返回string类型
- type()方法,可以获取一个变量的类型
- 在C#种,float类型的数尾部一个f结尾
注释有三种
- 单行注释
--
- 多行注释有三种
--[[ ]]
--[[ --]]
--[[ ]]--
运算符
- Lua中没有++和—
- C#中+号有数学相加和字符串相连的功能
- Lua只有数学意义,字符串相连用
..
- lua中没有复合赋值运算符,即+=,-=这些
- lua中的关系运算符是
~=
- lua中的与或非是
and,or,not
分支结构
- c#与lua中的包裹方式不同,lua用
if(布尔表达式)then 代码体 end
- else结构
if(布尔表达式) then 代码体 else 代码体 end
- 注意 then关键字出现在if的下方
- else if 结构
if(布尔表达式) then 代码体 elseif(布尔表达式) then 代码体 else 代码体 end
- 在lua中elseif两个单词是相连的,中间没有空格
- 在lua中没有switch语句
循环结构
- lua中用do end包裹代码体
- 在lua中用逗号进行分隔,C#用分号
for i=0,10,1 do
代码体
end
while(布尔表达式)
do
代码体
end
- lua语言中没有do while 语句,但是有一个新的语句
repeat
代码体
until (a<b)
- until的作用和while刚好相反,只有在不满足的时候才会运行,满足的情况下就会退出
-lua中只有break关键字,c#有break和continue两个关键字
数组
- C#版本只能存放固定数据类型的数组
- lua中的数组可以存放多种不同类型的数据
数组名={数据1,数据2,数据3,数据N}
- C#中循环遍历数组,下标是从0开始
- lua中循环遍历数组,下标是从1开始,取数组长度需要用到
table.getn(数组名)
- C#中的数组长度是固定的,而Lua中数组长度则是不固定的,声明完毕数组后,依然可以往后续的下标位置上添加值
函数
[局部/全局] function 函数名([参数列表])
--函数体
end
- lua语言中在脚本编写顺序上必须先定义函数,然后在下方才可以调用
- 在C语言中,函数传递需要委托来实现
- Lua语言中没有委托概念,可以直接当作参数来传递
function Add(a,b)
return a+b
end
function DelegateF(a,b,func)
retuen func(a+b)
end
DelegateF(1,2,Add)
作用域对比
- C#中全局变量声明完毕后,就算不手动初始化赋值,也会有默认值,int型为0,引用类型为null
- 但是局部变量声明完后,必须要赋值,否则无法使用
- Lua语言中的变量,默认全部是全局变量,就算是声明在函数内的变量,也是全局变量
- 要事先执行一遍函数,才能在访问到函数内的变量
- 可以把函数内的变量声明为 local ,则访问不到
- 在外部定义的变量,即使是local,也可以在函数内访问到,类似C#中private的字段,类中可以访问到
- lua中默认函数是全局函数,设置为局部函数需要用到 local,类似于private,仅对外部脚本访问它的时候有限制作用
字符串的表现形式
- 有三种表现形式
- 用双引号包裹
"hello"
- 用单引号包裹
'hello'
- 用两个中括号包裹
[[hello]]
- 注意事项
- 在Lua中双引号,单引号效果几乎是一样的,中括号比较特殊,属于原格式输出
- 在lua语言中,字符串相连,用
..
- 常用转义符
\n
换行\\
一个\\"
一个”\'
一个’- 与C#中含义相同
- 常用string操作
- 注意lua中内置的类和方法都是小写
- 转换大小写
string.upper(),string.lower()
- 字符串反转
string.reverse(字符串变量)
- 字符串长度
string.len()
- 字符串反转
string.reverse()
- 字符串替换
string.gsub(原始字符串,旧字符串,新字符串,[替换次数])
- 替换次数不写则默认为 全部替换
- 要对字符串格式化,c#中有两种方式
Console.WriteLine("你好,我的名字是"+name);
- 用+号连接字符串和变量
- 第二种方式
Console.WriteLine("你好,我的名字是{0}",name)
- 使用占位符的方式
- 在U3D种,没有CW可以使用,就用
string.format()
进行字符串格式化
- 在Lua语言种,有一个string.format()函数,可以对字符串进行格式化
- 不同点,它使用格式说明符来进行占位,这一点和c语言很相似
- %d 表示整数
- %s 表示字符串
- %f 表示小数,%0.1f保留1位小数,%0.2f保留两位小数
table
- Lua语言种的数组其实就是table类型
- table是Lua语言的一种代码格式结构,数组就是使用这种结构实现的
- 基本使用
- 初始化table
表名={}
- 给table赋值,有两种方式,数组方式的角标赋值,键值对方式
myTable2={}
myTable2["侯志敏"]=23
myTable2["贾亚杰"]=20
myTable2["石玉"]=12
myTable={}
myTable[1]="JIAYAJIE"
myTable[2]="kusdjias"
myTable[3]=223
- 迭代器遍历
//数组方式
for key,value in ipairs(表名) do
print(key,value)
end
键值对结构就用pairs方
table.insert(表名,[位置],值)适合数组模式
键值对使用 表名[键]=值
table.remove(表名,[位置])
表名[键]=nil
table.getn(表名)直接获得
迭代器迭代,用一个变量获得长度
模块
- 模块当中基本的成员就算变量和函数
- Lua语言的模块在功能上类似于C#中我们写的一个静态工具类
- Lua中的模块,在语法上类似于命名空间,需要引入才能使用
- 创建一个新的lua脚本
- 初始化一个table,名字要和脚本名相同
- 用tableName.变量,和tableName.function来定义变量和函数
- 模块的最后要写return 模块名
- 使用模块,require(“模块名”)或者 require “模块名”
- 然后访问变量和方法
元表
- 元表(metatable)让两个表之间产生附属关系,只需要操作主表就可以间接操作元表
- 在Lua语言中模拟面向对象,元表是不可或缺的
- 基本操作
- 实例化两个普通表
- 关联两个表
- setmetatable(表A,表B) 将表A设置为表B的主表,表B是元表
- getmetatable 如果表名有元表,就返回元表的类型和地址,如果没有,就返回一个nil
- __index索引
- 如果想通过主表操作元表的成员,需要设置元表的
__index
- 元表名.__index=元表名
- 我们可以直接用表名.键名的方式访问元素
tableA={name='周',age=22,gender='woman'}
tableB={Bname='贾',Bage=25,Bgender='man'}
//设置元表
setmetatable(tableA,tableB)
print(getmetatable(tableA))
//设置__index索引
tableB.__index=tableB
print(tableA.Bname)
面向对象介绍
- Lua本身没有强大的类库,,只是一个简单而又小巧的语言,是作为其他语言的一个辅助存在的
- Lua语言本身没有类和对象的概念的
- 使用Table模拟出来了类和对象的关系
命名规则