2011-12-22 13 views
5

Sto cercando di capire come viene eseguito OOP in Lua, e ho pensato di avere un modo semplice per farlo ma non funziona e io sono solo non vedendo la ragione. Ecco quello che sto cercando:Gli argomenti Lua passati alla funzione nella tabella sono nil

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, sto lavorando con il Corona SDK, anche se io parto dal presupposto che non fa la differenza (se non che è dove print() viene dal credo). In ogni caso, la parte che mi sta uccidendo è che inName è nullo come riportato da print (inName) ... quindi, myName è ovviamente impostato su zero quindi chiamate a direHello() falliscono (anche se funzionano bene se ho hardcode un valore per myName, che mi porta a pensare che la struttura di base che sto cercando sia valida, ma mi manca qualcosa di semplice). Sembra, per quanto posso dire, che il valore di inName non venga impostato quando viene chiamato newPerson(), ma non riesco a capire perché; Non vedo perché non è come qualsiasi altra chiamata di funzione.

Qualsiasi aiuto sarebbe apprezzato. Grazie!

risposta

7

Prova

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

Vorrei poter accettare sia le vostre sia le risposte di Nicol come corrette, entrambi avete capito esattamente ... Vi sto dando solo perché avete risposto prima :) Ma grazie Nicol per averlo spiegato anche ... era, come mi aspettavo, qualcosa di stupido che ho semplicemente dimenticato, nemmeno una cosa che non sapevo. Grazie ancora, tutto funziona come dovrebbe e come voglio ora :) –

+4

@ Schollii: Prova a spiegare le tue risposte nel forum StackOverflow. – karthik

+0

@karthik: hai ragione, grazie per il promemoria! – Schollii

9

ricordare che questo:

function Person:newPerson(inName) 

è equivalente a questo:

function Person.newPerson(self, inName) 

Di conseguenza, quando si esegue questa operazione:

Person.newPerson("Frank"); 

Si sta passando un parametro a una funzione che prevede due. Probabilmente non vuoi creare newPerson con :.

Problemi correlati