El tratamiento de Nils en función de clasificación
Pregunta
No sé cómo manejar nils
mi función de clasificación pone.
Cuando tengo esta comprobación en ella, table.sort
se bloquea después de algunas llamadas.
if a == nil then
return false
elseif b == nil then
return true
end
Con este error: función de orden no válido para la clasificación . Pero de acuerdo con la documentación, función de clasificación debe devolver false, si una va después b. Es cierto lo contrario.
Si quito quitar ese código, que por supuesto se estrella de Nils indexación.
Solución
Esto tiene poco o nada que ver con los valores nil
en la tabla. El mensaje de error se genera si la función de comparación en sí no es válido. A partir de la documentación de table.sort
:
Si se da
comp
, entonces debe ser una función que recibe dos tipos de tabla elementos, y los retornos cierto cuando el primero es menor que el segundo (de modo quenot comp(a[i+1],a[i])
será verdad después de la clasificación).
En otras palabras, debe implicar comp(a,b)
not comp(b,a)
. Si esta relación no se cumple, entonces el error "función de orden no válido para la clasificación" probablemente levantada. (Tenga en cuenta que puede que no se crió en todos los casos.)
Con el fin de ser más útil, que realmente necesita para ver toda la función pasada a table.sort
.
Otros consejos
Para poner todos los valores nulos en el principio de la matriz:
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
Para poner todos los valores nulos en el final de la matriz:
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