2014-12-12 7 views
1

루아의 메타 테이블이 OOP에서 작동하는 방식을 배우고 있으며 lua-users의 객체 지향 튜토리얼에서 읽은 코드를 혼동합니다. 위키. 누군가 다음 질문을 설명하는 데 도움이 될 수 있습니까? 감사.setmetatable() 작동 방식과 lua의 링크 목록에 메타 테이블이 필요한 이유

질문 1 : 위키 설명 : 여기서 __call 메타 메서드가있는 클래스 테이블에 메타 테이블을 추가합니다.이 메타 테이블은 값이 함수처럼 호출 될 때 트리거됩니다. 클래스의 생성자를 호출하도록 만듭니다. 따라서 인스턴스를 만들 때 .new가 필요하지 않습니다.

(1) 예제에서 __call이 어떻게 호출되어 생성자가 호출 되었습니까?
(2) "cls"는 "MyClass"를 의미합니까?

setmetatable(MyClass, { 
    __call = function (cls, ...) 
    return cls.new(...) 
end, 
}) 

질문 2 : 다음 코드의 {}는 무엇을 의미합니까?

local MyClass = {} 
MyClass.__index = MyClass 

setmetatable(MyClass, { 
    __call = function (cls, ...) 
    return cls.new(...) 
end, 
}) 

function MyClass.new(init) 
    local self = setmetatable({}, MyClass) 
    self.value = init 
    return self 
end 

function MyClass:set_value(newval) 
    self.value = newval 
end 

function MyClass:get_value() 
    return self.value 
end 

local instance = MyClass(5) 
-- do stuff with instance... 
+0

이 검색 쿼리에는 Lua 메타 테이블에 대한 정보가 있습니다. https://www.google.com/?gws_rd=ssl#q=lua+metatables –

답변

1

질문 1 :

setmetatable(MyClass, { 
    __call = function (cls, ...) 
    return cls.new(...) 
end, 
}) 

이는 __call 메타 메서드를 정의하는 테이블에 MyClass에의 메타 테이블을 설정

function MyClass.new(init) 
    local self = setmetatable({}, MyClass) 
    self.value = init 
    return self 
end 

** 다음은 전체 코드입니다. 그 때문에 MyClass (newObj = MyClass(<args>))를 '호출 할 수 있습니다. 메타 메서드에서 cls는 호출 된 테이블을 참조하며,이 경우에는 MyClass를 참조합니다.

질문 2 :

function MyClass.new(init) 
    local self = setmetatable({}, MyClass) 
    self.value = init 
    return self 
end 

는 {} 새로운 테이블 (이 경우 비어있는)를 생성 리터럴 테이블 구문이다. MyClass 테이블은 새 테이블의 메타 테이블로 설정됩니다. 그런 다음이 새 테이블이 자체에 할당됩니다.

자세한 내용은 여기를 참조하십시오. https://www.google.com/?gws_rd=ssl#q=lua+metatables Anderson Green의 의견에 따르면.

+0

감사합니다. –