La documentation officielle le décrit#comme suit : L'opérateur de longueur s'écrit comme l'opérateur unaire #. La longueur d'une chaîne est son nombre d'octets (c'est-à-dire la longueur d'une chaîne calculée comme un octet par caractère).
La longueur d'une table t est définie comme un indice entier n. Elle vérifie que t[n] n'est pas nil et que t[n+1] est nil ; en outre, si t
local tblTest2 =
{
1,
a = 2,
3,
}
print(table.getn(tblTest2))
Quelle est la sortie de ce code ? La sortie ici devrait être2. Premièrement, vous devez comprendre que ce ctblTest2c n'est pas un simple ctable ; il mélange deux styles : liste et record. Dans la table,a = 2il est en style record. Deuxièmement, vous devez comprendre qu'un enregistrement de style record n'est pas compté dans le calcul de la longueur de la table externe. Vous pouvez le considérer comme une fonction ; tout comme dans d'autres langages orientés objet, les fonctions ne sont pas enregistrées comme variables internes.
Puisque c'est comme une fonction, vous pouvez afficher la valeur de a, oui.print(tblTest2.a)C'est tout.
Maintenant, regardez le code suivant :
local tblTest3 =
{
1,
{a = 2},
3,
}
print(table.getn(tblTest3))
Quelle est la sortie de ce code ? La sortie ici devrait être3. Notez qu'une table imbriquée dans une table est aussi un élément. Par conséquent, la sortie est3。
table.getn(t)est équivalent à#t。
Le cas suivant est assez déroutant ; vous pouvez directement lire le résumé dans la dernière phrase :
Regardons maintenant un cas assez déroutant :
local tblTest4 =
{
1,
nil,
}
print(table.getn(tblTest4))
Quelle est la sortie de ce code ? C'est 1. Nous savons tous que lorsqu'une table obtient sa longueur, elle parcourt toute la table et retourne à la dernière valeur non nil.
Mais qu'en est-il du code suivant ?
local tblTest5 =
{
1,
nil,
2,
}
print(table.getn(tblTest5))
Il affiche 3. Amusant, non ? Il compte nil comme un élément lors du calcul de la longueur. Mais celui qui vous déroute vraiment, c'est le code suivant :
local tblTest5 =
{
1,
nil,
2,
nil
}
Cela affiche 1. Voici un autre extrait pour vous embrouiller complètement :
local tblTest5 =
{
1,
nil,
2,
nil,
3,
nil
}
Cela affiche 3. Confus ? Regardez encore ; cette section vous fera ne plus jamais oser écrire de valeurs nil dans une table désormais :
local tblTest5 =
{
1,
nil,
2,
nil,
3,
nil,
4,
nil
}
Jetez un œil, la sortie de cette section est 1. Mon cher, osez-vous encore utiliser des valeurs nil dans les tables Lua à l'avenir ??? Si vous continuez à ajouter nil par la suite, vous pourriez découvrir quelque chose. Vous pourriez penser avoir trouvé un schéma. Mais vous ne devez jamais penser que c'est un schéma. Parce que c'est faux.
- 1. N'utilisez pas nil dans les tables.
- 2. Si vous devez vraiment utiliser nil, vous devez utiliser la fonction table.setn() pour définir la longueur de la table. Remarque : les versions plus récentes de Lua ne prennent plus en charge setn.
Nous devons vous donner une conclusion :La fonction setn est obsolète. N'utilisez pas de valeurs nil dans les tables Lua. Si un élément doit être supprimé, supprimez-le simplement ; ne le remplacez pas par nil.
Source : http://www.cnblogs.com/youxin/p/3799339.html