您的位置:首页 > 编程语言 > Lua

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: