Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:lua:面向对象

Lua面向对象

Lua语言层面是不支持面向对象的,所以需要使用者自己实现


成员函数定义和调用方式

Lua成员函数的定义可以使用.(点)或者:(冒号),函数调用也是两个符号都可以使用,区别如下:

data = {}
 
-- 内部环境没有self
function data.f1(a,b,c)
    print('--------------------')
    print(a)
    print(b)
    print(c)
    print('--------------------')
end
 
-- 内部环境有self(虽然没有出现在参数列表中)
function data:f2(a,b,c)
    print('--------------------')
    print(self)
    print(a)
    print(b)
    print(c)
    print('--------------------')
end
 
-- 调用方式和定义方式保持一致就是可以的
data.f1(1,2,3) -- 没有self,像是静态函数
data:f2(1,2,3) -- 有self,像是普通成员函数
 
data.f2(1,2,3) -- 参数错位:少传递了一个self,参数不够,第一个参数当了self
-- 但这种还是可以挽救的,手动多传递一个self就行
data.f2(data,1,2,3) -- 手动将对象data放在参数列表里面,这时定义和调用的参数列表是不一样的
 
data:f1(1,2,3) -- 参数错位:多了一个self,第三个参数没用
输出:
--------------------
1
2
3
--------------------
--------------------
table: 0000000000e39560
1
2
3
--------------------
--------------------
1
2
3
nil
--------------------
--------------------
table: 0000000000e39560
1
2
3
--------------------
--------------------
table: 0000000000e39560
1
2
--------------------

继承

以上是直接创建一个Table,创建的Table就是实例
如果先创建一个类,从这个类实例化出对象?
类如何继承?

零散

  • 使用点或者冒号定义的都是成员函数,名字相同就是同一个函数,不应该出现分别使用两个符号定义的同名函数
  • 通过点可以将函数作为变量传递,看看以下的代码
---
---闭包绑定lua函数
---@param self table
---@param func function
Bind = function(self,func)
    if self == nil then
        return function(...) return func(...) end
    else
        return function(...) 
            return func(self,...) 
        end
    end
end
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/lua/面向对象.txt · Last modified: 2022/10/07 04:30 by zh