2014-12-19 7 views
1

는이 코드를 실행하고 그것은 나에게 인덱스 글로벌 '자기'(nil의 값)에 오류 시도시도가

hook.Add("Think", "Cooking", function() 
    local Position = self:GetPos() + self:GetAngles():Up()*20 
    local rawFood = ents.FindByName("my_raw_food") 
    for k, v in pairs(rawFood) do 
     if(Position:Distance(v:GetPos()) <= 25) then 
     v:Remove() 
     timer.Create(self:EntIndex() .. "my_food", 5, 1, function() self:createFood() end) 
     end 
    end 
end) 
+3

아마도 'function()'대신'function (self)'를 써야 할 것입니다. –

답변

5

그것은없이 말을 열심히했다 더 많은 코드, 특히 코드 주위의 범위를 볼 수 있습니다.

하지만 "self"가 범위에 존재하지 않는 것처럼 들립니다. 어느 그것은 함수에 매개 변수로 제공해야합니다

hook.Add("Think", "Cooking", function(self) 
    print(self) -- uses the 'self' parameter 
end) 

또는 함수를 선언의 범위에서 사용할 수 있어야하고, 그것이 폐쇄의 일부가 될 것입니다 :

function MyClass.addHook(self) -- same as MyClass:addHook() 
    hook.Add("Think", "Cooking", function() 
    print(self) -- uses the 'self' in scope (la MyClass instace) 
    end) 

비록 , self은 물론 범위 내에서 선언 된 경우에도 nil 일 수 있습니다. MyClassInstance:addHook() 대신 MyClassInstance.addHook()을 호출하는 것이 가장 일반적입니다. 16 - Object-Oriented Programming 설명서에 기재된 바와 같이 객체 지향 프로그래밍을 사용할 때

1

자기 사용된다.

자기를 사용하려면 암시 ​​적으로 첫 번째 인수로 전달해야합니다. 문자 :

내 말은 ...

myObject = { id = 1 } 
function myObject:hello(name) 
    print("hello " .. name .. " I'm object id : " .. tostring(self.id)) 
end 

// Using the . char the object must be the first argument 
myObject.hello(myObject, "world") 

// Using the : char the obect is automatically set as the first arg 
myObject:hello("world") 

그래서 코드에서, 나는 당신이를 사용해야합니다 같아요.

hook:add(...) 
+0

'hook.Add ("Think", ...)'함수가'self'를 첫 번째 매개 변수로 요구한다면,'self'가'string' (nil 값이 아님) . – CalvinE