Tratando nils na função de classificação
Pergunta
Eu não sei como lidar nils
Minha função de classificação recebe.
Quando eu tenho essa verificação, table.sort
trava após algumas ligações.
if a == nil then
return false
elseif b == nil then
return true
end
Com este erro:Função de ordem inválida para classificar. Mas, de acordo com a documentação, a função de classificação deve retornar falsa, se A seguir após b. Verdade em contrário.
Se eu remover esse código, é claro que as intervalos da indexação de NILs.
Solução
Isso tem pouco ou nada a ver com nil
valores na tabela. A mensagem de erro é gerada se a função de comparação for inválida. Da documentação para table.sort
:
Se
comp
é dado, então deve ser uma função que recebe dois elementos da tabela e retorna verdadeiro quando o primeiro é menor que o segundo (de modo quenot comp(a[i+1],a[i])
será verdade após o tipo).
Em outras palavras, comp(a,b)
deve implicar not comp(b,a)
. Se essa relação não for mantida, o erro "Função de ordem inválida para classificar" provavelmente será aumentada. (Observe que pode não ser levantado em todos os casos.)
Para ser mais útil, realmente precisamos ver toda a função passada para table.sort
.
Outras dicas
Para colocar todos os valores nulos no início da 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 colocar todos os valores nulos no final da 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