“La tentative de l'indice local...” Pourquoi j'obtiens cette erreur?
Je suis nouveau sur Lua et d'essayer de faire avancer les choses triées dans ma tête. J'ai essayé ce code:
function newCarousel(images)
local slideToImage = function()
print("ah!")
end
end
local testSlide = newCarousel(myImages)
testSlide.slideToImage()
Qui m'a donné cette erreur:
Tentative d'indice local "testSlide" (une valeur nulle)...
Pourquoi est-ce?
OriginalL'auteur Elliot Bonneville | 2011-05-19
Vous devez vous connecter pour publier un commentaire.
Si vous voulez être en mesure de faire
testSlide.slideToImage()
vous devez modifiernewCarousel
de sorte qu'elle retourne un tableau avec une fonction à l'intérieur d'elle. L'implémentation la plus simple est la suivante:Vous pouvez même construire des t et de le retourner sur une seule étape; le code suivant est équivalent à celui ci-dessus:
OriginalL'auteur kikito
Parce que
newCarousel
ne retourne rien, donctestSlide
est nul, de sorte lorsque vous essayez d'index (testSlide.slideToImage
est exactement équivalente àtestSlide["slideToImage"]
), vous obtenez un message d'erreur.Je vous recommande de lire La programmation en Lua. Vous pouvez être en mesure de travailler sur la langue, de la syntaxe, de la sémantique, et les expressions idiomatiques par essais et erreurs, mais il vous faudra beaucoup plus de temps.
Je seconde la Boue de la recommandation de lire la Programmation en Lua. S'il est facile d'apprendre les rudiments de la langue et de faire quelques choses pour le travail, Lua a quelques fonctions très puissantes qui ne sont tout simplement pas évident, sauf si vous avez lu la documentation.
J'ai été tenté de le faire. Notez que lorsque egarcia dit "la solution la plus simple, il signifie la chose la plus simple qui vous permettra d'obtenir votre code cassé au travail, mais dans le contexte plus large de votre code (
newCarousel
est la création d'un objet etslideToImage
est une méthode) c'est pas la bonne solution à votre problème. Ce que vous voulez vraiment est une métatable contenant votre Carrousel méthodes, et d'unenew
méthode qui s'applique à un nouvel objet. Cependant, de vous donner les connaissances nécessaires pour comprendre que la solution nécessiterait la réplication de la plupart de la Programmation en Lua ici, je viens donc recommandé de la lire.Je comprends, et de l'apprécier. Je vais être sûr de vérifier, et je vais probablement faire référence à beaucoup, mais pour le moment, j'essayais juste de résoudre un problème particulier. Je upvoted votre question, mais il a accepté egarcia de réponse parce que c'est ce que je cherchais.
OriginalL'auteur Mud
Le code que vous avez maintenant, comme La boue a déclaré, ne retourne rien. (Ce n'est pas le Régime ou le Rubis ou le comme le lieu de la dernière expression est la valeur de retour.) De plus, vous semblez penser que
newCarousel
est un objet. Il n'est pas. C'est une fonction. Lorsque vous avez terminé l'appelnewCarousel
c'est fini. Il fait son travail, quel qu'il soit (ce qui dans votre cas est de créer une variable locale qui est rapidement tombé et le retournil
).Code Correct pour ce ressemblerait plus à:
Ici j'ai maintenant
newCarousel
la création d'un (anonyme) de la fonction et le retour immédiat. Cette fonction anonyme est lié àtestSlide
afin que je puisse les appeler en tout temps, j'aime bien aussi longtemps quetestSlide
reste dans la portée.Il est instructif de regarder le code généré lors de la lecture avec Lua. Tout d'abord, regardons ce que
luac
rejettent pour votre code:Dans votre code la canalisation principale crée une fermeture, se lie avec le nom
newCarousel
, obtient de cette valeur, obtient la valeur demyImages
et fait un appel. Cela correspond àlocal testSlide = newCarousel(myImages)
. Ensuite, il obtient leslideToImage
valeur de la table locale (testSlide
). Le problème ici est quetestSlide
n'est pas un tableau, il estnil
. C'est là que votre message d'erreur. Ce n'est pas la seule erreur, vous l'esprit, mais c'est la première, l'exécution voit et c'est ce qui fait tout le starter. Si tu étais de retour d'une fonction réelle denewCarousel
vous obtenez une erreur différente. Si, par exemple, j'avais ajouté la lignereturn slideToImage
à lanewCarousel
fonction, le message d'erreur aurait été de "tentative d'indice local "testSlide' (une valeur de la fonction)".OriginalL'auteur JUST MY correct OPINION