2016-06-11 1 views

Répondre

9

Parce que la table table , qui contient les fonctions génériques pour manipuler les tables fournies par la bibliothèque standard, n'est pas dans la métatable pour une table par défaut. En fait, une table n'a pas de metatable à moins d'être spécifiée explicitement.

Vous pouvez le faire manuellement si:

local xyz = {1,2,3} 
local mt = { __index = table} 
setmetatable(xyz, mt) 
xyz:insert(2) 
xyz:sort() 
+0

'print (xyz: unpack())' pour une autre utilisation agréable d'une méthode de table. –

+1

Ceci contrairement à une valeur typée en chaîne, qui (dans les versions récentes de Lua) contient initialement la table de chaînes standard en tant que méthode méta __index. –

4

@YuHao donne une réponse directe. C'est plus de fond.

L'opérateur deux-points est un opérateur d'indexation; Il indexe la valeur de l'expression sur la gauche avec l'identifiant (en tant que clé typée) sur la droite.

expression:identifier(arg0, arg1, ...) 

est conceptuellement le même que

local lhs = expression 
lhs.identifer(lhs, arg0, arg1, ...) 

est conceptuellement le même que

local lhs = expression 
lhs["identifer"](lhs, arg0, arg1, ...) 

Alors, votre question n'est pas tant sur l'opérateur du côlon car il est sur l'indexation. Dans Lua, l'indexation d'une valeur de type table vérifie d'abord les champs de la table pour la clé. Si trouvé, il renvoie la valeur. Si ce n'est pas le cas, il vérifie dans la table s'il est associé à une méta-donnée facultative et si cette table a une valeur avec la clé "__index". Si introuvable, le résultat de l'indexation est nil. Si la valeur du champ __index est une table, le processus se répète sur cette table. Si la valeur est une fonction, le résultat de l'indexation est la valeur de retour de l'appel de cette fonction.

Dans votre cas, en tant que @YuHao explains, votre table n'a pas de champ de tri ni de métabalissable. Le résultat d'indexation est donc nil, ce qui entraîne l'erreur de tentative d'appel d'une valeur nulle. (Le message indique bien que vous avez utilisé la syntaxe deux-points en disant qu'il s'agit d'un "appel de méthode".)

0

C'est parce que xyz n'a pas de paire clé/valeur où la clé est "sort" et la valeur est une fonction. table a ladite paire clé/valeur. Essayez ceci pour clarifier les choses:

local xyz = {} 
print(xyz.sort) -- prints nil 
print(table.sort) -- prints function: 0xabcd1234