2011-12-22 15 views
5

Próbuję uzyskać obsługę sposobu, w jaki OOP jest wykonywana w Lua, i myślałem, że mam prosty sposób to zrobić, ale to nie działa i po prostu jestem nie widząc powodu. Oto, co usiłuję:Argumenty Lua przekazane do funkcji w tabeli są zerowe

Person = { }; 
function Person:newPerson(inName) 
    print(inName); 
    p = { }; 
    p.myName = inName; 
    function p:sayHello() 
    print ("Hello, my name is " .. self.myName); 
    end 
    return p; 
end 

Frank = Person.newPerson("Frank"); 
Frank:sayHello(); 

FYI, pracuję z Corona SDK, chociaż jestem przy założeniu, że nie ma różnicy (poza tym, że tam print() pochodzi od wierzę). W każdym razie, część, która mnie zabija to to, że inName jest zerowe, jak zostało to zgłoszone przez print (inName) ... w związku z tym myName jest oczywiście ustawione na zero, więc wywołania sayHello() nie powiodą się (mimo że działają poprawnie, gdybym zakodował wartość dla myName, co skłania mnie do myślenia, że ​​podstawowa struktura, którą próbuję, jest dobra, ale muszę czegoś brakować). Wygląda na to, o ile mogę powiedzieć, że wartość inName nie jest ustawiana, gdy wywoływana jest funkcja newPerson(), ale nie mogę dla mnie zrozumieć dlaczego; Nie rozumiem, dlaczego nie jest to po prostu jak każde inne wywołanie funkcji.

Każda pomoc zostanie doceniona. Dzięki!

Odpowiedz

7

Spróbuj

Frank = Person:newPerson("Frank"); 
+0

Chciałbym móc przyjąć zarówno twoje, jak i odpowiedzi Nicola, jako prawidłowe, oboje dokładnie to dostaliście ... Daję wam to tylko dlatego, że odpowiedzieliście najpierw :) Ale dziękuję Nicol za wyjaśnienie tego ... to było, jak się spodziewałem, coś głupiego, że po prostu zapomniałem, nawet czegoś, o czym nie wiedziałem. Jeszcze raz dziękuję, wszystko działa tak, jak powinno i jak chcę teraz :) –

+4

@ Schollii: Spróbuj wyjaśnić swoje odpowiedzi na forum stackoverflow. – karthik

+0

@karthik: masz rację, dziękuję za przypomnienie! – Schollii

9

Pamiętaj, że:

function Person:newPerson(inName) 

jest równoważne to:

function Person.newPerson(self, inName) 

Dlatego, kiedy to zrobić:

Person.newPerson("Frank"); 

Przekazujesz jeden parametr do funkcji, która oczekuje dwóch. Prawdopodobnie nie chcesz, aby newPerson został utworzony za pomocą :.

Powiązane problemy