LUA基础总结

****************************字符串操作*****************
字符串格式化
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   


结果:"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"

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值