Не совсем ответ, но я решил одну проблему только для моего случая (загрузка исходного кода Python).
Как мне заставить
blockquote>open
работать?Оказалось, что кодирование строк недоступно, поэтому я использовал
rb
вместоr
. Затем я передаюbytes
вcompile
, он может справиться с ними.
Вы могли использовать что-то как набор от Программирование в Lua:
function Set (list)
local set = {}
for _, l in ipairs(list) do set[l] = true end
return set
end
Тогда Вы могли поместить свой список в Набор и протестировать на членство:
local items = Set { "apple", "orange", "pear", "banana" }
if items["orange"] then
-- do something
end
Или Вы могли выполнить итерации по списку непосредственно:
local items = { "apple", "orange", "pear", "banana" }
for _,v in pairs(items) do
if v == "orange" then
-- do something
break
end
end
Используйте следующее представление вместо этого:
local items = { apple=true, orange=true, pear=true, banana=true }
if items.apple then
...
end
Вы видите непосредственно одни из недостатков Lua, имеющего только одну структуру данных---, Вы имеете к самокрутке. Если Вы будете придерживаться Lua, то Вы будете постепенно накапливать библиотеку функций, которые управляют таблицами в способе, которым Вам нравится делать вещи. Моя библиотека включает преобразование списка к набору и ищущую список функцию высшего порядка:
function table.set(t) -- set of list
local u = { }
for _, v in ipairs(t) do u[v] = true end
return u
end
function table.find(f, l) -- find element v of l satisfying f(v)
for _, v in ipairs(l) do
if f(v) then
return v
end
end
return nil
end
Таблицы Lua являются более тесно аналогами словарей Python, а не списков. Таблица, которую Вы имеете, создает, по существу индексный массив на основе 1 строк. Используйте любой стандартный алгоритм поиска, чтобы узнать, находится ли значение в массиве. Другой подход должен был бы сохранить значения как ключи таблицы вместо этого как показано в реализации набора сообщения Jon Ericson.