구름바람의 루아 대상 코드 분석
                                            
 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에 따라 라이센스가 부여됩니다.