Большинство версий Lua поддерживают арифметические c операторы сравнения для таблиц. Например, рассмотрим этот сценарий, упрощенный как абстракция для обработки длин различных единиц:
local function convert_units (input)
if type(input) ~= "table" then
return input
else
if input.unit == "cm" then
return input.amount * 10
else
return input.amount
end
end
end
local mt = {
__lt = function (self, other)
return convert_units(self) < convert_units(other)
end
}
local a = {
amount = 1.2,
unit = "cm"
}
local b = {
amount = 14,
unit = "mm"
}
setmetatable(a, mt)
setmetatable(b, mt)
print(a < b)
Это выведет true
, потому что в мета-таблице есть метод __lt
, который приводит объекты в совместимость единиц, а затем сравнивает их. Этот код будет работать в Lua 5.1, 5.2 и 5.3
Проблема возникает, когда вы пытаетесь найти несоответствующие типы, например:
print (a < 13)
Это будет работать в Lua 5.2 и 5.3, но в Lua 5.1 будет выдано сообщение об ошибке:
lua5.1: попытка сравнить число с таблицей
Математический мета-метод совершенно способен обрабатывать необработанное число на одной стороне сравнения, но Lua 5.1 отказывается даже пытаться.
К сожалению, мне нужно иметь возможность поддерживать диапазон Lua интерпретаторов. С наименьшим общим знаменателем, равным Lua 5.1, это будет означать либо всегда делать сайт с необработанными числами аналогичным экземпляром объекта, либо всегда использовать convert_units()
при написании сравнений.
Учитывая объем и Сложность кода Было бы очень хорошо, если бы я мог Shim Lua 5.1 для поддержки этого. Есть ли способ убедить его в том, что он позволяет сравнить таблицу с числом?