Lua基本语法

lua基本语法

   lua是一种脚本语言,它的执行效率大概是C的10倍左右,而现在风头正盛的python
执行效率大概是C的100倍 所以Lua也有自己的一番天地,游戏的脚本中就大量的使用
Lua语言,因为最近在搞使用脚本语言来做嵌入式开发,所以先从Lua入手。

   我在windows上所使用的开发环境是Lua for windows这款IDE直接安装即可是使用
无需配置环境,Lua的版本是Lua 5.1.5,虽然Lua更新了新版,增加了对UTF-8编码的支持,
但是5.1.5的效率更高使用也更广泛。
   不喜欢Lua for windows的编辑器的,也可以用sublime配置,用起来更舒服一些。

Lua官网

流程控制

cond 条件
doSomething 执行函数
var 变量
begin 起始量
finish 结束量
step 步进值

if条件

local x = 1   --局部变量关键字标志  修饰局部变量
局部变量可与全局变量同名

if flag then
   doSomething()
else


if flag then
    doSomething()
elseif status then
    doSomething()
else
    doSomething()
end

while循环

while  cond  do
    doSomething()
end

repeat 循环

repeat
    doSomething()
until cond

for循环

for var = begin,finish,step  do
    doSomething()
end

for if 嵌套

for i = begin,finish  do
    if i == 3   then
       break
    end
    doSomething()
end

return 主要用于函数结果

function sum(x,y)
    return x+y
end
local sum = sum(1,1)
print(sum)

运算符与函数

==    等于   判断相等
~=    不等于
>     大于
<     小于
>=    大于等于
<=    小于等于

%     取余
^     乘幂
-     负号

and   逻辑与
or    逻辑或
not   逻辑非

..    连接字符串
#     返回字符串长度  print(#str1)

运算符优先级

^  not#-  */%  +-  ..  <><=>===~=  and  or

字符串

local str1 = 'hello world'
local str2 = "hello world"
local str3 = [[hello world]]

字符串操作

string.upper(str)       将字符串转为大写
string.lower(str)       将字符串转为小写
string.gsub(sourceStr,findStr,replaceStr,num)   替换字符串
string.find(str,substr,[init,[end]])      在指定字符串中搜索指定字符串
string.reverse(str)      字符串反转
string.format(...)       返回一个格式化的字符串
string.char(args)        返回整数所对应的ASCII码字符串
string.byte(str[,int])   返回字符串对应的ASCII码 int为从几个开始
string.byte("abc",1,3)   -->97 98  99
string.len(str)          计算字符串的长度
string.rep(str,n)        返回字符串的第n次拷贝
string.gmatch(str,pattern)   返回一个迭代器 遍历str中出现pattern的地方
string.match(str,pattern,init)  字符串中匹配模式字符串pattern若匹配成功则返回
                                匹配成功字符串,若没有则返回nil,init表示从第
                                几个开始匹配
string.sub(s,i,[,j])            返回字符串s  索引i到j之间的字符串
string.gsub(s,p,r[,n])    将s中所有子串p替换成字符串r  n表示现在替换次数

string.format()格式化所涉及格式

%c            将一个数字转化为ASCII码中对应的字符
%d,%i         将一个数字转化为有符号的整数
%o            将数字转化为八进制格式
%u            将数字转化为无符号整数
%x            将数字转化为十六进制格式  小写字母
%X            将数字转化为十六进制格式  大写字母
%e            将数字转化为科学计数法格式 小写字母
%E            将数字转化为科学计数法格式 大写字母
%f            将数字转化为浮点型格式
%s            将数字转化为浮点型格式

eg.print(string.format("%d",2.3))

使用示例

--1、string.upper(str)转换为大写
print(string.upper("hello Lua"))
-->HELLO LUA
-------------------------------------
--2、string.lower(str)转换为小写
print(string.lower("HELLO"))
-->hello
-------------------------------------
--3、string.gsub(sourceStr,findStr,replaceStr,num)替换指定字符串
print(string.gsub("hello lua","l","L",2))
-->heLLo lua	2
-------------------------------------
--4、string.find(str, substr, [init, [end]])查找字符串
print(string.find("hello lua","lua",3))
-->7	9
-------------------------------------
--5、string.reverse(str) 反转字符串
print(string.reverse("Lua"))
-->auL

6、string.format(…)
print(string.format("%f" , 20))
-->20.000000
-------------------------------------
print(string.format("%d" , 2.3))
-->2
-------------------------------------
print(string.format("%o" , 10))
-->12

--7、string.char(args)
print(string.char(97))
-->a
-------------------------------------
--8、string.byte(str[,int]) 如果后边的int为空则默认1
print(string.byte("abc" , 1 ,3))
-->97	98	99
--如果上例没有1,3则只输出97
-------------------------------------
--9、string.len(str)字符串长度
print(string.len("hello Lua"))
-->9
-------------------------------------
--10、string.rep(str, n) 返回字符串n次拷贝
print(string.rep("abc" , 3))
-->abcabcabc
-------------------------------------
--11、string.gmatch(str, pattern)
for w in string.gmatch("hello lua" , "%a+") do
    print("=======" , w)
end
-------------------------------------
--12、string.match(str, pattern, init) 匹配
print(string.match("hello lua", "lua"))
-->lua
-------------------------------------
--13、string.sub(s, i [, j])
print(string.sub("Hello Lua", 4, 7))
print(string.sub("Hello Lua", 2))
-------------------------------------
--14、string.gsub(s, p, r [, n])
print(string.gsub("Lua Lua Lua", "Lua", "hello"))
-->hello hello hello	3

print(string.match("hello 2019/1/2","%a%a%a%a%a"))
-->hello

table表

Lua Table的索引下标是从 1 开始的 不是 0

创建空的表  
local mytable = {  }
指定值
mytable[1] = "Hello Lua"
清空操作
mytable = nil

函数操作

table.concat(table,[,sep[,i[,j]]])连接

sep为填充字符,默认为空白,将table[i]到table[j]连城字符串

local mytable = {"hello","lua","ceshi"}
print(table.concat(mytable,"--"))

>>hello--lua--ceshi

table.insert(table,[pos,]value)

table 的pos位置插入value值

local mytable = {"hello","lua","ceshi"}
table.insert(mytable,"sport")
print(table.concat(mytable,"|"))

>>hello|lua|ceshi|sport

table.maxn(table)

获取表内整数key中最大的key值 如果不存在正数 则返回0

自定义函数实现
function table_maxn(t)
	local tmp = nil;
	for k,v in pairs(t) do
		if(tmp==nil)  then
			tmp = v
		end
		if tmp < v then
			tmp = v
		end
	end
		return tmp
end
tb1 = {[1] = 10,[2] =100,[3] = 60,[26] = 50}
print(table.maxn(tb1))

table.sort(table,[,comp])

对table进行升序排列

local mytable = {[1] = 10, [2] = 100, [3] = 60, [4] =50}
table.sort(mytable)
print("table 排序:", table.concat(mytable,"-"))

>>	10-50-60-100

table.remove(table[,pos])

删除table中pos位置的元素 ,默认值为表的长度即删除最后一个
若删除的是中间位置,则其后的索引值都会减一

local mytable = {"hello","lua","ceshi"}
print(table.remove(mytable,1))

>>hello

模块

多文件调用 模块化编程时 lua的调用其他模块方法

新建splitutil.lua

新建main.lua

local splitutil = require(“splitutil”) --引入splitutil

splitutil.split() --调用splitutil.lua中的function

for 型迭代器

ipairs(t)遍历数值型索引值

table根据内部类型分为数字型table和非数字型(泛型)table

for k,v in ipairs do
    doSomething()
end

ipairs()函数是按照连续数值型索引的值,对于非数字型咋不输入
而且只遍历连续数值 若中间间断则无法继续索引

pairs(t)可以遍历混合型的table

local table2 = {[1] = "a",["hello"] = "aaaa",[2] = "b",[4] = "c"}
for i,v in pairs(table2) do
	print("i=",i,"v=",v )
end

所有元素输出是无序的

ipairs(t)函数只能是数值型索引table,输出结果为连续数值型索引,若有中断则只输出连续的元素。
pairs(t)函数可以支持纯数值型索引和混合索引table,且无序输出。

元表

元表及元方法

setmetable(table,metatable)      --对指定的table表设置元表metatable
getmetatable(table)              --获取table的元素
local mytable = { }
local mymetatable = { }
setmetable(mytable,mymetatable)

可简写为setmetable({},{})

运算原方法

__add       +
__sub       -
__mul       *
__div       /
__mod       %
__eq        ==
__It        <
__le        <=

元方法

__index	    查找table中索引值key,对table表的访问
__newindex	对table表进行更新
__tostring	输出字符串
__call	    调用值
__mode	    用于弱表
__metatable	用于保护metatable不被访问

文件I/O操作

文件I/O操作

操作方法	说明
io.open (filename [, mode])	  按照指定的mode打开一个文件
io.close ([file])	            关闭文件,若无参数,关闭默认输出文件
io.flush ()	                  把缓冲区的数据写入到文件中
io.input ([file])	            打开文件(文本模式)
io.lines ([filename])	        以读的方式返回一个迭代器
io.output ([file])	          类似于 io.input,但操作在默认输出文件上
io.read (…)	                  相当于io.input():read
io.type (obj)	                检查obj是不是文件如果是打开的,则返回file,
若不是则返回"close file",如果不是文件则返回nil
io.write (…)	                相当于io.output():write写文件
file:close ()	                关闭文件
file:flush ()	                把缓冲区的数据写入到file中
file:lines ()	                返回迭代函数,每次调用返回一行数据,文件尾时返回nil,但是不关闭文件
file:read (…)	                按照指定格式读取文件,返回字符串或数字,读取错误返回nil,没有设置按照行读取
file:write (…)	              写文件,参数必须是字符串或数字
file:seek ([whence] [, offset])	设置和获取当前文件位置,成功返回文件位置,失败返回nil
file:setvbuf (mode [, size])	设置文件缓冲模式

io.open模式

r	只读模式(默认)	返回nil和错误信息
w	写模式	创建文件    会将之前有的内容删除掉
a	添加模式	创建文件
r+	更新模式,保存之前的数据	返回nil和错误信息
w+	更新模式,清除之前的数据	创建文件
a+	添加更新模式,保存之前的数据,在文件尾添加	创建文件

io.write 输出文件内容

1.
file = io.open("lua.txt","r")
for line in file:lines() do
	print(line)
end
io.close()
2.
for line in io.lines("lua.txt") do
	print(line)
end

io.write("") 写入文件内容

file = io.open("lua.txt","a")
io.output(file)
io.write("\n....lua world")    --且每执行一次写入一次
io.close(file)

for line in io.lines("lua.txt") do
	print(line)     --将行打印出来
end

lua面向对象

面向对象

面向对象特征

封装:把一个实体的信息封装到一个对象中。
继承:在不改变原有程序的基础上进行扩展,有利于减少代码重复提高开发效率。
多态:同一操作作用在不同的对象上,产生不同的结果。
接下来介绍下Lua如何实现面向对象的,在开始前先说下点和冒号的区别:
    . 需要接受self参数
    : 默认传入self

.的实现方法

local _M = {
	username = "zhangsan",
	age = 30
}

function _M.getusername(self)
	return self.username
end

function _M.getage(self)
	return self.age
end

return _M

local sharep = require("sharep")
local username = sharep.getusername(sharep)
print(username)
local age = sharep.getage(sharep)
print(age)

:的实现方式

local _M = {
	rate = 3.14,
	lang = 1
}

local mt = {__index = _M}

function _M:new()
	setmetatable(_M,mt)
	return _M
end

function _M.area(lang)
	self.lang = lang
	local area = self.rate*(lang/2)*(lang/2)
	return area
end

return _M
 第一次写博客,将今天学习的lua基本语法纪录下来,希望能坚持下去!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值