2013-07-21 2 views
1

я получаю ошибку «попытки вызвать метод„Dot“(нилъ значения)» при выполнении следующего кода:Ошибка при использованияКонтактном это методе «попытки вызвать метод (нилъ значения)» Для Метастабильной

-- Vector2 Class 
Vector2 = {X = 0, Y = 0, Magnitude = 0, Unit = nil} 
function Vector2.new(XValue,YValue) 
    local Tmp = {} 
    setmetatable(Tmp,Vector2) 
    Tmp.X = XValue 
    Tmp.Y = YValue 

    Tmp.Magnitude = math.sqrt(Tmp.X * Tmp.X + Tmp.Y * Tmp.Y) 
    if Tmp.Magnitude ~= 1 then 
     Tmp.Unit = Tmp/Tmp.Magnitude 
    else 
     Tmp.Unit = Tmp 
    end 

    return Tmp 
end 

-- Arithmetic 
function Vector2.__add(A,B) 
    if getmetatable(A) == getmetatable(B) then 
     return Vector2.new(A.X+B.X, A.Y+B.Y) 
    end 
end 

function Vector2.__sub(A,B) 
    if getmetatable(A) == getmetatable(B) then 
     return Vector2.new(A.X-B.X, A.Y-B.Y) 
    end 
end 

function Vector2.__mul(A,B) 
    if tonumber(B) ~= nil then 
     return Vector2.new(A.X*B, A.Y*B) 
    end 
end 

function Vector2.__div(A,B) 
    if tonumber(B) ~= nil then 
     return Vector2.new(A.X/B, A.Y/B) 
    end 
end 

function Vector2.__unm(Tmp) 
    return Vector2.new(-Tmp.X, -Tmp.Y) 
end 

-- Comparisons 
function Vector2.__eq(A,B) 
    if getmetatable(A) == getmetatable(B) then 
     if A.X == B.X and A.Y == B.Y then 
      return true 
     else 
      return false 
     end 
    end 
end 

function Vector2.__lt(A,B) 
    if getmetatable(A) == getmetatable(B) then 
     if A.Magnitude < B.Magnitude then 
      return true 
     else 
      return false 
     end 
    end 
end 

function Vector2.__le(A,B) 
    if getmetatable(A) == getmetatable(B) then 
     if A.Magnitude <= B.Magnitude then 
      return true 
     else 
      return false 
     end 
    end 
end 

-- Functionals 
function Vector2.__tostring(Tmp) 
    return Tmp.X..", "..Tmp.Y 
end 

function Vector2:Dot(B) 
    return self.X*B.X + self.Y*B.Y 
end 

function Vector2:Lerp(B,Amn) 
    return self + (B-self)*Amn 
end 

print(Vector2.new(1,0.3).Magnitude) 
print(Vector2.new(1,0):Dot(Vector2.new(0,1))) 

Я не понимаю, что я сделал не так, может кто-нибудь протянуть руку, у меня есть хороший опыт Lua, но только начал изучать, как использовать metatables, поэтому я новичок на этом этапе, я запускаю его используя SciTE, с LuaForWindows. Ошибка находится на последней линии, но линия над ней работает отлично

ответ

1

Вы забыли установить __index поле:

Vector2 = {X = 0, Y = 0, Magnitude = 0, Unit = nil} 
Vector2.__index = Vector2 
+0

благодарственные, но объяснение, которое я получил за __index было то, что он был использован, если индексирующие скобки '[]' были использованы на вашем метатете, почему это повлияет на методы? делает Lua что-то позади, чтобы индексировать ваш метатебель? –

+0

Прочтите [PiL] (http://www.lua.org/pil/13.html). Metatable и Class могут быть одной и той же таблицей, но не должны быть одинаковыми. –