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.

Foi útil?

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 que not 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top