Вопрос

Я не знаю, как справиться nils моя функция сортировки получает.

Когда у меня будет эта проверка в нем, table.sort вылетает после нескольких звонков.

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

С этой ошибкой:недопустимая функция заказа для сортировки.Но согласно документации, функция сортировки должна возвращать false, если a идет после b.Верно в остальном.

Если я удалю удалить этот код, это, конечно, приведет к сбою индексации nils.

Это было полезно?

Решение

Это имеет мало или вообще ничего общего с nil значения в таблице.Сообщение об ошибке генерируется, если сама функция сравнения недействительна.Из документации для table.sort:

Если comp задано, тогда это должна быть функция, которая принимает два элемента таблицы и возвращает значение true, когда первый меньше второго (так что not comp(a[i+1],a[i]) будет истинным после сортировки).

Другими словами, comp(a,b) должно подразумевать not comp(b,a).Если это соотношение не выполняется, то, скорее всего, будет выдана ошибка "недопустимая функция заказа для сортировки".(Обратите внимание, что он может быть поднят не во всех случаях.)

Чтобы быть более полезными, нам действительно нужно увидеть всю функцию, переданную table.sort.

Другие советы

Поместить все нулевые значения в начало массива:

  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

Поместить все нулевые значения в конец массива:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top