2014-06-18 63 views
1

我已經收到以下錯誤與這部分代碼:的Lua試圖索引全球的「自我」的錯誤(GMOD的Lua腳本)

[ERROR] lua/entities/cook/init.lua:58: attempt to index global 'self' (a nil value)1. cooked - lua/entities/cook/init.lua:58 

功能開始於第57行,當我刪除線58 (local Pos = self.Entity:GetPos(),它只是給出了線相同的錯誤消息61

function cooked() 
    local Pos = self.Entity:GetPos() 
    local roll = math.random(1, 5); 
     if roll == 5 then 
     self.Entity:EmitSound("phx/explode06.wav") 
     self.Entity:Remove() 
     else 
     local createfood = ents.Create("food") 
     createfood:SetPos(Pos + Vector(0,10,100)) 
     createfood:Spawn() 
     self:SendLua("GAMEMODE:AddNotify(\"You finish cooking the food and package the product!\", NOTIFY_GENERIC, 4)") 
     end 
end 
+0

爲什麼你接受迷宮的答案,但不是湯姆的,這不僅是正確的,而且還解釋了爲什麼? – nonchip

回答

1

目前還不清楚self應該是什麼。該錯誤表示它是全局的,與您所顯示的代碼一致。

但是,self幾乎專門用作函數的形式參數,而隱式函數則用於此。

當隱含self時,該函數被稱爲方法,因爲意圖用於訪問傳遞到self的表中的字段。方法值幾乎總是由同一個表中的字段保存(或者至少可以通過元方法獲得)。

函數定義中的冒號語法創建一個方法。

如果cooked是一種方法,那麼訪問self是有意義的。但是cooked是全球性的。

您可能意味着:

function sometable:cooked() 
-- ... 
-- self is an implicit formal parameter 
-- ... 
end 

如何閱讀上面的Lua聲明:

  1. 訪問sometable爲表
  2. 轉讓其「熟」字段由創建的函數值功能定義。

(函數定義從方法的語法編譯,所以在體內,self是第一形式參數,這是隱式的。)

的方法可以被稱爲等:

sometable:cooked() -- passes sometable as self 

字段函數調用中的冒號語法是一個方法調用。

如何閱讀上面的Lua聲明:

  1. 訪問sometable作爲一個表,
  2. 指數的「熟」字段,
  3. 調用其作爲函數值,傳遞sometable作爲第一參數,
  4. 丟棄結果列表。

天下奇聞:

  • 的方法的語法只不過是 「語法糖」。方法值與其他函數值沒有區別:
    • 可以使用任何函數調用語法來調用使用any語法從函數定義創建的函數。
      • 無需使用方法調用語法調用方法。
      • 可以使用方法調用語法來調用非方法。
  • self不保留,因此它可以用作任何標識符是。
1

自我是零,那麼你怎麼罵熟()? 它必須是self.cooked(self)或self:cooked(),其中self是你想在你的函數中用作self的表。

+0

實際上,該函數也必須定義爲'function sometable:cooked()'或'function sometable.cooked(self)' – nonchip