4

nilssort 関数の getを処理する方法がわかりません。

これをチェックインすると、table.sortいくつかの呼び出しの後にクラッシュします。

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

このエラー:並べ替えの順序関数が無効です。ただし、ドキュメントによると、a が b の後に続く場合、sort 関数は false を返す必要があります。それ以外の場合は true。

そのコードを削除すると、もちろんインデックス作成の nil がクラッシュします。

4

2 に答える 2

13

nilこれは、テーブル内の値とはほとんど、またはまったく関係がありません。比較関数自体が無効な場合、エラー メッセージが生成されます。のドキュメントからtable.sort:

が与えられた場合comp、それは 2 つのテーブル要素を受け取る関数である必要があり、最初の要素が 2 番目の要素よりも小さい場合に true を返します (したがって not comp(a[i+1],a[i])、並べ替え後に true になります)。

つまり、comp(a,b)を意味する必要がありnot comp(b,a)ます。この関係が成り立たない場合、「並べ替えの順序関数が無効です」というエラーが発生する可能性があります。(すべての場合に発生するとは限らないことに注意してください。)

より役立つようにするには、 に渡される関数全体を実際に確認する必要がありますtable.sort

于 2010-01-21T23:48:48.227 に答える
2

配列の先頭にすべての nil 値を配置するには:

  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

配列の末尾にすべての nil 値を配置するには:

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
于 2010-01-20T16:38:02.097 に答える