구름바람의 루아 대상 코드 분석
12030 단어 lua
구름바람wiki:https://blog.codingnow.com/cloud/LuaOO
local _class={}
function class(super)
local class_type = {}
class_type.ctor = false
class_type.super = super
class_type.new=function(...)
local obj={}
do
local create
create = function(c,...)
if c.super then
create(c.super,...)
end
if c.ctor then
c.ctor(obj,...)
end
end
create(class_type,...)
end
setmetatable(obj,{ __index=_class[class_type] })
return obj
end
local vtbl={}
_class[class_type]=vtbl
setmetatable(class_type,{__newindex=
function(t,k,v)
vtbl[k]=v
end
})
if super then
setmetatable(vtbl,{__index=
function(t,k)
local ret=_class[super][k]
vtbl[k]=ret
return ret
end
})
end
return class_type
end
클래스 정의
base_type = class() -- base_type
function base_type:ctor(x) -- base_type
print("base_type ctor")
self.x=x
end
function base_type:print_x() -- base_type:print_x
print(self.x)
end
function base_type:hello() -- base_type:hello
print("hello base_type")
end
test=class(base_type) -- test base_type
function test:ctor() -- test
print("test ctor")
end
function test:hello() -- base_type:hello test:hello
print("hello test")
end
클래스 사용
a = test.new(1) -- ,base_type ctor test ctor 。 。
a:print_x() -- 1 , base_type 。
a:hello() -- hello test , 。
둘.지식점
1. __index
__index는 탭에 존재하지 않는 필드를 찾을 때 터치합니다. 탭에 있는 필드의 기본값 문제를 해결하는 데 도움을 줄 수 있습니다.모듈을 계승하려면
setmetatable(obj, {__index = XXX})
XXXX
계승을 희망하는 모듈 이름입니다.2. __newindex
__새 index는 테이블에 존재하지 않는 필드에 대한 값을 감시하는 데 사용됩니다.새 index 메타데이터가 호출될 때 세 개의 인자가 전송됩니다:table 자체, 필드 이름, 부여하고자 하는 값입니다.
setmetatable(obj, { __newindex =
function(t, k, v)
-- TODO
end
})
이제 위에 운풍대신의 루아 코드를 해석해 보도록 하겠습니다.
셋.코드 해석
-- _class
local _class = {}
-- ,super
function class(super)
-- class_type
local class_type = {}
-- ctor
class_type.ctor = false
--
class_type.super = super
-- new
class_type.new = function(...)
local obj = {}
do
-- create , ctor ,
local create
create = function(c,...)
if c.super then
-- , ctor
create(c.super, ...)
end
if c.ctor then
--
c.ctor(obj, ...)
end
end
create(class_type, ...)
end
-- obj _class[class_type], vtbl,obj
setmetatable(obj, { __index = _class[class_type] })
-- new obj
return obj
end
-- vtbl
local vtbl = {}
_class[class_type] = vtbl
-- class_type , vtbl
setmetatable(class_type, { __newindex=
function(t, k, v)
vtbl[k] = v
end
})
if super then
-- , , _class , vtbl
-- , , ,
setmetatable(vtbl, { __index =
function(t, k)
local ret = _class[super][k]
vtbl[k] = ret
return ret
end
})
end
-- , ctor , , vtbl ,
-- new , vtbl ctor , obj
-- , obj , obj vtbl, vtbl
-- vtbl ,
return class_type
end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Neovim을 위한 자동 완성NeoVim으로 생산성을 높일 수 있는 가장 멋진 기능 중 하나는 자동 완성이므로 성능에 따라 플러그인을 선택할 수 있습니다. YouCompleteMe Coc.nvim 이 플러그인은 사용하기 좋지만 Javascrip...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.