****************************字符串操作*****************
字符串格式化
string.format("基本格式化 %s %s","测","试")--> 基本格式化 测试
%Ns ->N代表数字,位数,被转换的字符不够N,前面加空格
print(string.format("%10s", "monkey")) -->monkey为6位数,所以,前面加10-6个空格与monkey拼写,结果4个空格monkey
%N.Ns ->N代表数字,位数,被转换的字符取小数点后的数字位数,不够小数点前面的位数,替换空格
print(string.format("%4.5s", "monkey")) -->"monkey"为6位数,取小数点后的5位,为monke,小数点后大于前数字,则不用加空格
结果为monke
-------------------------------------
数字格式化
%02d ->0为占位符,0后面的2,代表,替换的数字位数少于2,则替换0
%03d,->替换数字少于3位数,替换0
比如 string.format("日期格式化 %02d/%02d/%03d", 1, 11,12)-> 日期格式化 01/11/012
-------------------------------------
小数点格式化
%.5 ->小数点后面的代表位数,所以5代表取小数点后5位,不足的话补0
-----------其它操作--------------------
%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
%A替换特殊符号,空格也会被替换指定的
----------------------------字符串长度--------------------
string.len("呵呵") -->长度为 2
----------------------搜索字符串里的日期格式--------------------
s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date))) --> 30/05/1999
--------------------替换--------------------
string.gsub(mainString,findString,replaceString,num)
在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:
> string.gsub("aaaa","a","z",3);
zzza 3
-----------------
string.sub(1,2,3)不同c# 中参数1为,要截取的字符串,参数2为从第几位截取,参数3不为空的话,代表截止到第几位,而c#是截取的个数
s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, 1,2)) --> De
print(string.sub(s, 1)) --> Deadline is 30/05/1999, firm
print(string.sub(s, string.find(s, date))) --> 30/05/1999
************************************for循环**************************************
function f(x)
--print("function")
return x*2
end
for i=1,f(5) do print(i)
end
for的三个表达式在循环开始前一次性求值,以后不再进行求值。比如上面的f(x)只会在循环开始前执行一次,其结果用在后面的循环中。
所以上述 循环体遍历1-10,
-----------------------步涨循环体-------------------
步涨循环体是,从i初始值参数1,每次+=第三个参数,打印<=参数2的值
for i=10,12,2 do
print(i)
end
i=10涨到12,每次涨2,所以结果为10 ,12,默认第三个参数不写是1
--不写的情况如
for i=10,11 do
print(i)
end
结果为 i=10,i=11,初始为10,第三个参数不写默认为1,10+1=11,所以刚好够打印
--------------------------键值对循环体-------------
days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
----------------------无状态循环体,类似键值对
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0
do
print(i,n)
end
i,n算是接收值,in 后面是迭代体,3是状态常量,0是控制变量
此遍历,控制变量每次步涨为1,<状态常量,与步涨循环体不一样
结果
1 1
2 4
3, 9
--------------------多态迭代-------------------
以table作为状态常量,所以不需要控制变量
array = {"Lua", "Tutorial"}
function elementIterator (collection)
local index = 0
local count = #collection
-- 闭包函数
return function ()
index = index + 1
if index <= count
then
-- 返回迭代器的当前元素
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
结果为
Lua
Tutorial
----------------------------lua内置循环关键字
pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil
ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出
*****************************table设置元表**************************
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
getmetatable(mytable) -- 这回返回mymetatable
-----------------------------------------------------------
__index
mytable = setmetatable({key1 = "value1"}, {
__index = function(mytable, key)
if key == "key2" then
return "metatablevalue"
else
return nil
end
end
})
print(mytable.key1,mytable.key2)
实例输出结果为:
value1 metatablevalue
解析:mytable 表赋值为 {key1 = "value1"}。
mytable 设置了元表,元方法为 __index。
在mytable表中查找 key1,如果找到,返回该元素,找不到则继续。
在mytable表中查找 key2,如果找到,返回 metatablevalue,找不到则继续。
判断元表有没有__index方法,如果__index方法是一个函数,则调用该函数。
元方法中查看是否传入 "key2" 键的参数(mytable.key2已设置),如果传入 "key2" 参数返回 "metatablevalue",
否则返回 mytable 对应的键值。
所以,如果原来的表没有这个键,但是有元表,则默认元表加入该键,所以上述判断key == "key3"时,则能打印出"key3"值为metatablevalue
总结:
Lua查找一个表元素时的规则,其实就是如下3个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
-----------------------------------------------------------
__newindex
有该元表关键字的话, 会给__newindex指定的表赋值,除非,操作表(mytable)有该键
如:
mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })
print(mytable.key1)
mytable.newkey = "新值2"
结果:
value1
nil 新值2 -->因为mytable没有newKey,且有元表__newindex关键字,则是给元表对应的表设置键,并赋值
tttttttt 200
矩形面积为, 200
10
-----------------------------------lua面向对象2--------------------------
面积为 100
字符串格式化
string.format("基本格式化 %s %s","测","试")--> 基本格式化 测试
%Ns ->N代表数字,位数,被转换的字符不够N,前面加空格
print(string.format("%10s", "monkey")) -->monkey为6位数,所以,前面加10-6个空格与monkey拼写,结果4个空格monkey
%N.Ns ->N代表数字,位数,被转换的字符取小数点后的数字位数,不够小数点前面的位数,替换空格
print(string.format("%4.5s", "monkey")) -->"monkey"为6位数,取小数点后的5位,为monke,小数点后大于前数字,则不用加空格
结果为monke
-------------------------------------
数字格式化
%02d ->0为占位符,0后面的2,代表,替换的数字位数少于2,则替换0
%03d,->替换数字少于3位数,替换0
比如 string.format("日期格式化 %02d/%02d/%03d", 1, 11,12)-> 日期格式化 01/11/012
-------------------------------------
小数点格式化
%.5 ->小数点后面的代表位数,所以5代表取小数点后5位,不足的话补0
-----------其它操作--------------------
%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
%A替换特殊符号,空格也会被替换指定的
----------------------------字符串长度--------------------
string.len("呵呵") -->长度为 2
----------------------搜索字符串里的日期格式--------------------
s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date))) --> 30/05/1999
--------------------替换--------------------
string.gsub(mainString,findString,replaceString,num)
在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:
> string.gsub("aaaa","a","z",3);
zzza 3
-----------------
string.sub(1,2,3)不同c# 中参数1为,要截取的字符串,参数2为从第几位截取,参数3不为空的话,代表截止到第几位,而c#是截取的个数
s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, 1,2)) --> De
print(string.sub(s, 1)) --> Deadline is 30/05/1999, firm
print(string.sub(s, string.find(s, date))) --> 30/05/1999
************************************for循环**************************************
function f(x)
--print("function")
return x*2
end
for i=1,f(5) do print(i)
end
for的三个表达式在循环开始前一次性求值,以后不再进行求值。比如上面的f(x)只会在循环开始前执行一次,其结果用在后面的循环中。
所以上述 循环体遍历1-10,
-----------------------步涨循环体-------------------
步涨循环体是,从i初始值参数1,每次+=第三个参数,打印<=参数2的值
for i=10,12,2 do
print(i)
end
i=10涨到12,每次涨2,所以结果为10 ,12,默认第三个参数不写是1
--不写的情况如
for i=10,11 do
print(i)
end
结果为 i=10,i=11,初始为10,第三个参数不写默认为1,10+1=11,所以刚好够打印
--------------------------键值对循环体-------------
days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i,v in ipairs(days) do print(v) end
----------------------无状态循环体,类似键值对
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0
do
print(i,n)
end
i,n算是接收值,in 后面是迭代体,3是状态常量,0是控制变量
此遍历,控制变量每次步涨为1,<状态常量,与步涨循环体不一样
结果
1 1
2 4
3, 9
--------------------多态迭代-------------------
以table作为状态常量,所以不需要控制变量
array = {"Lua", "Tutorial"}
function elementIterator (collection)
local index = 0
local count = #collection
-- 闭包函数
return function ()
index = index + 1
if index <= count
then
-- 返回迭代器的当前元素
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
结果为
Lua
Tutorial
----------------------------lua内置循环关键字
pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil
ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出
*****************************table设置元表**************************
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
getmetatable(mytable) -- 这回返回mymetatable
-----------------------------------------------------------
__index
mytable = setmetatable({key1 = "value1"}, {
__index = function(mytable, key)
if key == "key2" then
return "metatablevalue"
else
return nil
end
end
})
print(mytable.key1,mytable.key2)
实例输出结果为:
value1 metatablevalue
解析:mytable 表赋值为 {key1 = "value1"}。
mytable 设置了元表,元方法为 __index。
在mytable表中查找 key1,如果找到,返回该元素,找不到则继续。
在mytable表中查找 key2,如果找到,返回 metatablevalue,找不到则继续。
判断元表有没有__index方法,如果__index方法是一个函数,则调用该函数。
元方法中查看是否传入 "key2" 键的参数(mytable.key2已设置),如果传入 "key2" 参数返回 "metatablevalue",
否则返回 mytable 对应的键值。
所以,如果原来的表没有这个键,但是有元表,则默认元表加入该键,所以上述判断key == "key3"时,则能打印出"key3"值为metatablevalue
总结:
Lua查找一个表元素时的规则,其实就是如下3个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
-----------------------------------------------------------
__newindex
有该元表关键字的话, 会给__newindex指定的表赋值,除非,操作表(mytable)有该键
如:
mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })
print(mytable.key1)
mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey)
mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)结果:
value1
nil 新值2 -->因为mytable没有newKey,且有元表__newindex关键字,则是给元表对应的表设置键,并赋值
新值1 nil -->因为mytable有key1,则是给mytable赋值
如果__newindex改为__index,则指的是给mytable赋值
print("-----------------------------------lua面向对象1--------------------------") -- Meta class Rectangle = {area = 0, length = 0, breadth = 0} -- 派生类的方法 new function Rectangle:new (o,length,breadth) o = o or {} self.__index = self setmetatable(o, self) self.length = length or 0 self.breadth = breadth or 0 self.area = length*breadth; --print("0",o.area) return o end -- 派生类的方法 printArea function Rectangle:printArea () print("矩形面积为,",t.area) end r = Rectangle:new(nil,10,20) t=r print("tttttttt",t.area) print(r.length,r:printArea()) print("-----------------------------------lua面向对象2--------------------------") Shape = {area = 0} -- 基础类方法 new function Shape:new (o,side) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; return o end -- 基础类方法 printArea function Shape:printArea () print("面积为 ",myshap.area) end -- 创建对象 myshap = Shape:new(nil,10) myshap:printArea()
以上结果:-----------------------------------lua面向对象1--------------------------
tttttttt 200
矩形面积为, 200
10
-----------------------------------lua面向对象2--------------------------
面积为 100