Lua语言学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33574890/article/details/82433117

命名规则的不同

  • 帕斯卡命名法主要是给类和方法命名,每个单词的首字母全部大写,其余小写
  • 驼峰命名法主要是给变量命名的,首个单词全部小写,其余单词首字母大写,剩下小写

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#用分号
//10是i<=10 条件表达式
//1 是i+1 增量表达式,步长
for i=0,10,1 do
  代码体
  end
  • while语句,用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的一些方法
  • 添加元素
table.insert(表名,[位置],值)适合数组模式
键值对使用 表名[键]=
  • 移除元素
table.remove(表名,[位置])
//同样适合数组模式,不指定位置默认为移除最后一个元素,超出范围,既不会报错,也不会有元素被移除
//键值对方式
表名[键]=nil
  • table 长度
// 对于数组模式
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模拟出来了类和对象的关系

命名规则

猜你喜欢

转载自blog.csdn.net/qq_33574890/article/details/82433117