2016-11-16 3 views
3

Независимо от того, как я приближаюсь Lua, я столкнулся с этой ошибкой все время, так что я не должен понять, что-то наследовать язык:попытка вызвать метод «FUNC» (нилъ значение)

попытка call method 'func' (значение nil)

Я видел ошибку здесь несколько раз, но проблема мне не кажется ясной.

Вот мой модуль:
actor.lua

Actor = { 
    x = 0, 
    mt = {}, 

    new = function() 
     local new_actor = {} 
     new_actor.x = Actor.x 
     new_actor.mt = Actor.mt 
     return new_actor 
    end, 

    test = function(self, a, b) 
     print(a, b) 
    end 
} 

Я использую ЛЮБОВЬ.
main.lua

require "game/actor" 
local a = Actor:new() --works fine 

function love.load() 
    a.x = 10 
    print(a.x) --output: 10 
    a:test(11, 12) --error: attempt to call method 'test' (a nil value) 
end 

Я также не уверен, когда это уместно использовать предыдущий стиль из-за этого в модуле.

Actor = { 
    x = 0 
} 
Actor.mt = {} 

function Actor.new() 
    print(42) 
end 

Я честно не уверен, что более правильно, чем другие, но учитывая, что я работать в простой ошибки в любом случае, там, наверное, что-то я совсем не хватает?

+1

Я отредактировал его, чтобы немного почистить его, в то время как вы сделали свое редактирование, вызывая конфликт, поэтому я просто вернул переменную переменную FYI. – Ajean

ответ

1

Похоже, вы пытаетесь создать класс, состоящий из метатетов. Вам в основном нужно назначить new_actor с Actor.mt. (Возобновление проблемы: когда вы индексировать new_actor вы не индексацией Actor в данном случае)

setmetatable(new_actor, Actor.mt); 

Даже если метатаблица добавляется, он не будет работать, пока вы не поставить мета «__index» событие индексировать таблицу, содержащую список методов класса/значений, в данном случае:

Actor.mt = { 
    __index = Actor 
}; 

Я предлагаю двигая методы класса/значения в новую таблицу, как Actor.prototype, Actor.fn и т.д ... предотвращение конфликта:

Actor.fn = { 
    test = function(self, a, b) 
     print(a, b) 
    end 
}; 

Actor.mt = { 
    __index = Actor.fn 
}; 

More about metatables in Lua 5.3 manual.

+1

Это работает и является дизайном, который я еще не видел. Спасибо. – liam

Смежные вопросы