lua学习

lua学习,第1张

概述变量 lua的变量是全局的,即一个文件中的变量所有的文件都可以访问。除非加入local进行限制。 给定2个文件,main.lua和x.lua。 -- main.lualocal x = 100-- dofile是进行调用执行外部文件dofile("x.lua")print("main.lua print",x)function foo( x,y ) print("foo",x) 变量

lua的变量是全局的,即一个文件中的变量所有的文件都可以访问。除非加入local进行限制。
给定2个文件,main.lua和x.lua。

-- main.lualocal x = 100-- dofile是进行调用执行外部文件dofile("x.lua")print("main.lua print",x)function foo( x,y )    print("foo",x)end-- 局部的x会覆盖整个文件的同名变量。这我就放心了。foo(1,2)
-- x.luaprint("x.lua print",x)

运行结果:

控制语句 if else语句。

其实就是多了一个then,比较特殊

if x == 100 thenendif x == 100 then   -- do sthelse   -- do sthendif x == 100 then   --elseif x == 200 then   --else   -- doend
for、while语句以及repeat循环
for i = 1,100,99 do    print(i)endwhile x >= 0 do     print(x,"x value")     x = x - 100endrepeat    print("repeat",x)    x = x+100until 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,x)y.__index = yprint(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)endfunction Base:Walk(a)    print("Base Walk",a)endlocal 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 oendfunction M:print()    print("x.lua M: print method")endreturn 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学习所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1240804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存