lua学习(附加lua调用终端)
2016-05-25 22:24
447 查看
lua调用终端
os.execute('mkdir test') --如果要输入密码的那种 passwd=123456 os.execute('echo 'passwd' | sudo -S mkdir test')
变量
lua的变量是全局的,即一个文件中的变量所有的文件都可以访问。除非加入local进行限制。给定2个文件,main.lua和x.lua。
-- main.lua local x = 100 -- dofile是进行调用执行外部文件 dofile("x.lua") print("main.lua print",x) function foo( x,y ) print("foo",x) end -- 局部的x会覆盖整个文件的同名变量。这我就放心了。 foo(1,2)
-- x.lua print("x.lua print",x)
运行结果:
控制语句
if else语句。
其实就是多了一个then,比较特殊if x == 100 then end if x == 100 then -- do sth else -- do sth end if x == 100 then -- elseif x == 200 then -- else -- do end
for、while语句以及repeat循环
for i = 1,100,99 do print(i) end while x >= 0 do print(x,"x value") x = x - 100 end repeat print("repeat",x) x = x+100 until x > 0
表
print方法
x = {} -- 或是写成 print(tostring()) print(x)
lua的print的变量如果是表,则查找表中有没有tostring的方法。tostring则查找有没有__tostring的方法。
local y = {__tostring = function ()return "i am a table" end} local x = {__tostring=function ()return "what" end} setmetatable(x,y) print(x,y)
print会调用__tostring方法,调用x时是调用x元表(此处是y)的__tostring()方法,就是调用y的__tostring()。
如果写成
local y = {__tostring = function ()return "i am a table" end} local x = {__tostring=function ()return "what" end} setmetatable(x,y) setmetatable(y,x) print(x,y)
运行得到
结论:print(y)时是找y元表的__tostring()方法,而y的元表就是x。x有__tostring()方法。
__index方法
local y = {__tostring = function ()return "i am a table" end, a =1} local x = {__tostring=function ()return "what" end, __index = function ()return 100 end} setmetatable(x,y) setmetatable(y,x) y.__index = y print(x.a,y)
解析:当调用table中不存在的字段时,会调用table元表的__index元方法,如果这个__index元方法是一个table的话,那么,就会在这个table里查找字段,并调用
当print(x.a)时,查找x表,发现x表没有a属性,所以就查找x的元表的__index方法。而x的元表是y,此外 y.__index = y;此时x的元表y的__index方法是一个表,就会查找y表的属性。
类
类函数成员的 ‘:’和’.’定义的区别
local Base= { name = "DefaultName" } function Base.Wakeup(b) print("Base Wakeup",self,b) end function Base:Walk(a) print("Base Walk",self,a) end local obj = {} setmetatable(obj,Base) Base.__index = Base -- 冒号调用时,会将 obj:Walk(1) obj.Walk(obj,1) obj.Wakeup(obj,1) obj:Wakeup(1)
解释:一句话:只要出现了”:”,对于调用就将自身作为第一个参数传入; 对于函数定义的话,就将传入的第一个参数作为self。
先看wakeup函数。定义时用“.”,属于常见的定义。obj.Wakeup(obj,1)和obj:Wakeup(1)是等价的。结果都是传入2个参数:obj和1 。由于定义是采用”.”,因此形参b的值就是obj。
再看walk函数。定义时用“:”,因此传入的第一个参数就是会作为self参数。
类的一般构造
在x.lua中local M={ } function M.New() local o = {} setmetatable(o,M) M.__index = M return o end function M:print() print("x.lua M: print method") end return M
在main.lua中
local X = dofile("x.lua") local a = X.New() a:Print()
输出:x.lua M: print method
C与lua交互
http://study.163.com/course/courseMain.htm?courseId=1002984001相关文章推荐
- 基于Lua的游戏服务端框架简介
- lua中的setfenv和getfenv
- lua使用spSkeletonData创建SkeletonAnimation&lua-binding
- Lua读取文件和写入文件
- table的三种遍历方式
- Tips on non-standard evaluation in R
- Using mutate from dplyr inside a function: getting around non-standard evaluation
- lua元表
- Lua的function、closure和upvalue
- 转:OpenResty最佳实践(推荐了解lua语法)
- 转: Lua 语言 15 分钟快速入门
- Lua Table 多字段排序
- Lua Day1
- 快速掌握Lua 5.3 —— 资源管理
- Lua内存泄露检测原理和weak_table弱引用
- Lua For Windows 环境配置及使sciTE支持中文
- Lua内存泄露检测原理
- lua table remove元素的问题
- lua 小数点后面几位
- BabeLua秒启调试补丁1.08,支持Quick, 支持VS2013和VS2015(2016.6.21更新)