Domanda

Non so come gestire nils mia funzione di ordinamento ottiene.

Quando ho questo controllo in esso, si blocca table.sort dopo alcune chiamate.

if a == nil then
    return false
elseif b == nil then
    return true
end

Con questo errore: Funzione ordine non valido per l'ordinamento . Ma secondo la documentazione, sorta funzione dovrebbe restituire false, se una va dopo b. È vero il contrario.

Se rimuovo rimuovere quel codice, naturalmente crash di Nils indicizzazione.

È stato utile?

Soluzione

Questo ha poco o nulla a che fare con i valori nil nella tabella. Il messaggio di errore viene generato se la funzione di confronto in sé non è valido. Dalla documentazione per table.sort :

  

Se viene dato comp, allora deve essere un   funzione che riceve due tabella   elementi, e restituisce vero quando il   primo è minore del secondo (in modo che   not comp(a[i+1],a[i]) sarà vero   dopo l'ordinamento).

In altre parole, comp(a,b) deve implicare not comp(b,a). Se questo rapporto non regge, allora l'errore "funzione di ordine non valido per l'ordinamento" sarà probabilmente sollevata. (Si noti che non potrebbe essere sollevato in tutti i casi).

Al fine di essere più disponibile, abbiamo davvero bisogno di vedere l'intera funzione passata a table.sort.

Altri suggerimenti

Per mettere tutti i valori nulli all'inizio della matrice:

  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

Per mettere tutti i valori zero alla fine della matrice:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top