Это ваш случай?
local shapes = { }
local function callback(shape_one)
-- ???
end
local the_shape = { is_circle = false }
shapes[4] = the_shape
assert(callback(the_shape) == 4)
Оба shapes[4]
и the_shape
содержат ссылку на значение, но в Lua нет другой связи между этими двумя переменными. Таким образом, вы не можете сказать «индекс переменной в таблице», вы должны скорее сказать «индекс значения в таблице», что соответствует значение в переменной ». Что именно «соответствует» зависит от вашего случая. В этом случае вы, скорее всего, ищете ссылочное равенство.
Обратите внимание, что в Lua все значения таблицы уникальны, поэтому the_shape ~= { is_circle = false }
(то есть новая таблица с идентичным содержимым), но the_shape == shapes[4]
(оба относятся к одному и тому же значению). Вы можете сравнить таблицы по стоимости, если это необходимо, но это отдельная тема.
Итак, если вы действительно хотите найти индекс значения в таблице, вам нужно его вручную искать. Либо сделать линейный поиск:
local function callback(shape_one)
for k, v in pairs(shapes) do
if v == shape_one then
return k
end
end
return nil, "shape not found" -- or maybe call error() here
end
... Или кэшировать все формы:
local function tflip(t)
local r = { }
for k, v in pairs(t) do
r[v] = k -- overrides duplicate values if any
end
return r
end
local shape_index = tflip(shapes)
local function callback(shape_one)
return shape_index[shape_one] -- will return nil if not found
end
Обратите внимание, что shape_index
бы, конечно, предотвратить вывоз мусора его содержимого. Предполагая, что его время жизни совпадает с временем жизни таблицы shapes
, и оно поддерживается в синхронизации с ним, это не проблема. Если это не ваше дело, вы можете настроить таблицу shapes
на слабую клавиатуру. (Скажите мне, если вы хотите, чтобы я расширил этот момент.)
Кстати, вы можете сохранить shape_index автоматически с помощью некоторой металируемой магии. Скажите мне, если вы хотите, чтобы это объяснялось, я обновлю ответ.
Близко связано с http: // stackoverflow.com/questions/9754285/in-lua-how-do-you-find-out-the-key-an-object-is-stored-in, если не дубликат. – lhf