Le traitement de la fonction nils de tri
Question
Je ne sais pas comment gérer nils
ma fonction de tri obtient.
Quand j'ai cette vérification en elle, les accidents de table.sort
après quelques appels.
if a == nil then
return false
elseif b == nil then
return true
end
Avec cette erreur: la fonction de commande non valide pour le tri . Mais d'après la documentation, la fonction tri doit retourner faux, si un va après b. Vrai autrement.
Si je supprime supprimer ce code, il d'accidents de cours de nils d'indexation.
La solution
Cela a peu ou rien à voir avec les valeurs de nil
dans le tableau. Le message d'erreur est généré si la fonction de comparaison elle-même est invalide. De la documentation table.sort
:
Si
comp
est donnée, alors il doit être fonction qui reçoit deux tables les éléments, et revient vrai lorsque le la première est inférieure à la seconde (de sorte quenot comp(a[i+1],a[i])
sera vrai après le tri).
En d'autres termes, comp(a,b)
doit impliquer not comp(b,a)
. Si cette relation ne tient pas, alors l'erreur « fonction de commande non valide pour le tri » sera probablement élevé. (Notez qu'il ne peut pas être soulevée dans tous les cas.)
Pour être plus utile, nous avons vraiment besoin de voir toute la fonction passée à table.sort
.
Autres conseils
Pour mettre toutes les valeurs nulles au début du tableau:
function mycomp(a,b)
if a == nil and b == nil then
return false
end
if a == nil then
return true
end
if b == nil then
return false
end
return a < b
end
Pour mettre toutes les valeurs nulles à la fin du tableau:
function mycomp(a,b)
if a == nil and b == nil then
return false
end
if a == nil then
return false
end
if b == nil then
return true
end
return a < b
end