美文网首页
Lua基础知识(二)

Lua基础知识(二)

作者: 渴望做一只特立独行的猪 | 来源:发表于2018-01-27 23:25 被阅读0次

    Lua中的面向对象


    1.Lua中类的原理

    Lua中没有类的概念,类是一个属性和方法的集合,而方法都是由方法名和方法名映射的方法函数构成,

    方法名可以称为键,而值就是方法体的内容所以说类实际上是一个键值对的.那么Lua中的表也是由键

    值对构成的,所以可以用lua中的表来模拟面向对象语言中的类.

    参考和转载自:链接地址

    大佬解释的很清楚,看完以后获益匪浅

    2.Lua中的"."和":"


            Person ={name ="小明"}

             Person2 ={name ="班长"}

            Person.talk=function (self,words )

            print(self.name.."说"..words)

             end

    但是为了使语句看起来更加清晰明了,前辈们为它添加了一个语法糖(在不改变功能的基础上,让程序看起来更方便)

    于是它变成了下面的这个样子]]

    -- function Person.talk(self,words)

    -- print(self.name.."说"..words)

    -- end

    --[[但是对我们程序员来说这个写起来还可以更加方便简洁(懒),于是有了下面的样子]]

    -- function Person:talk(words)

    -- print(self.name.."说:"..words)  --变得和C#中的this变得更加形象

    -- end

    -- Person:talk("老师你别说了我出去")

    -- Person.talk(Person,"别想我")

    -- Person.talk(Person2,"赶紧的,滚犊子!")

    --比起上面的代码多了一个点,少了一个self,却依然可以使用self,不过这个self只能指代自己

    --[[

    3.Lua如何查找表中的元素


    查找表中的元素类似于查找类中的属性和方法

    如果我们要在P表中查找talk这个键所对应的值,请看以下粘贴内容:

    matetable叫做元表,原表的作用就是增加和改变表的既定操作,只有设置过的表才会收到原表的影响从而改变自身行为

            它具以下两个全局方法:

            setmetatable(t,m) 将表t的元表设置为表m

            getmetatable(t) 通过t获得它的原表m

            元方法

    元表作为一个表,可以拥有任意类型的键值对,其真正对被设置的表的影响是Lua规定的元方法键值对。这些键值对就是

    Lua所规定的键,比如前面说到的__index,__add,__concat等等。这些键名都是以双下划线__为前缀。其对应的值

    则为一个函数,被称为元方法.

    例:

    -- m = {}

    -- m.__index = function (table,key)

    -- return "undefined"

    -- end

    -- pos = {x=1,y=2}

    -- print(pos.z)

    -- setmetatable(pos,m)

    -- print(pos.z)

    --元表的__index属性实际上是给表配备了找不到键时的行为。

    --注意:元表的__index属性对应的也可以为一个表。

    -- local m = {

    -- __add = function (t1,t2) --下划线两下

    -- local sum = {}

    -- for k,v in pairs(t1) do

    -- sum[k] =v

    -- end

    -- for k,v in pairs(t2) do

    -- print(type(sum[k]))

    -- sum[k] = sum[k]+v

    -- end

    -- return sum

    -- end

    -- }

    -- local table1 = setmetatable({1,2,3,4,5},m)

    -- local table2 = setmetatable({6,7,8,10},m)

    -- for k,v in pairs(table1 + table2) do

    -- print(k,v)

    -- end

    --元表的__add属性是给表定义了使用+号时的行为。

    4.类的实现


    Person={}

    --模拟面向对象的构造函数

    function  Person:New(name)

    local p = {} --设置类的实例

    Person.__index = Person  --设置index为自身

    setmetatable(p,Person) --person设置为p的元表

    p.name = name

    return p

    end

    --talk方法

    function Person:talk(words)

    print(self.name.."说:"..words)

    end

    local p1 = Person:New("路人甲")

    p1:talk("我是路人甲")

    --Lua手册参考地址

    相关文章

      网友评论

          本文标题:Lua基础知识(二)

          本文链接:https://www.haomeiwen.com/subject/xbwoaxtx.html