С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для craftersmine
31 / 29 / 9
Регистрация: 06.06.2014
Сообщений: 373

Сделать таблицу итерируемой

11.06.2020, 16:37. Показов 1124. Ответов 10
Метки lua (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Возможно ли сделать таблицу итерируемой

Например:
Lua
1
2
3
for k, v in table do
    print(k .. " | " .. v);
end
или например если таблица возвращается функцией:
Lua
1
2
3
for k, v in getTable() do
    print(k .. " | " .. v);
end
Читал про метаметоды и метатаблицы, получилось сделать метод __next и пройтись по таблице с помощью pairs(tbl)
Lua
1
2
3
for k, v in pairs(table) do
    print(k .. " | " .. v);
end
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.06.2020, 16:37
Ответы с готовыми решениями:

Сделать таблицу умножения, таблицу сложения, а также таблицу возведения в степень
Помогите написать код) Сделать таблицу умножения, таблицу сложения, а также таблицу возведения в степень. Функция:...

Как сделать при добавлении записи, в таблицу примка, ее идприемки записывался в таблицу ремонт и испытание
Как сделать при добавлении записи, в таблицу примка, ее идприемки записывался в таблицу ремонт и испытание. Т.е я добавляю приемку...

Сделать таблицу
Помогите пожалуйста сделать таблицу как эта. Заранее спасибо.

10
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,529
Записей в блоге: 9
11.06.2020, 20:55
Если вы можете как в вашем 3ем примере, то сделайте
Lua
1
2
3
function getTable()
  return pairs(table)
end
И будет работать ваш 2ой пример.
1
 Аватар для craftersmine
31 / 29 / 9
Регистрация: 06.06.2014
Сообщений: 373
11.06.2020, 22:36  [ТС]
Второй то работает, но как сделать так чтобы работал и 1ый и 2ой?

Например
Lua
1
2
3
4
tbl = getTable();
for k, v in table do
    print(k .. " | " .. v);
end
0
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,529
Записей в блоге: 9
11.06.2020, 23:54
Разве что так
Lua
1
2
3
4
5
6
7
8
9
10
11
function getIter()
  return function ()
    return pairs(table)
  end
end
 
i = getIter()
 
for k, v in i() do
    print(k .. " | " .. v);
end
0
 Аватар для craftersmine
31 / 29 / 9
Регистрация: 06.06.2014
Сообщений: 373
12.06.2020, 07:21  [ТС]
Нет, я походу не правильно задал вопрос

Функция возвращает таблицу, по типу
Lua
1
local tbl = getSomeTable(someArg1, someArg2);
и должна быть возможность ее перебрать в for-цикле
Lua
1
2
3
for k, v, in tbl do
    print(k .. " | " ..  v);
end
Но также должна быть возможность использовать функцию в цикле
Например та же самая функция
Lua
1
2
3
for k, v in getSomeTable(someArg1, someArg2) do
    print(k .. " | " ..  v); 
end
и результат у них должен быть идентичный
0
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,529
Записей в блоге: 9
12.06.2020, 10:55
Насколько я понимаю, так нельзя. for-у требуется не сама таблица, а next, tbl, nil.
https://www.lua.org/pil/7.3.html
В чём проблема указывать pairs?
Lua
1
for k, v in pairs(getSomeTable(someArg1, someArg2)) do
0
 Аватар для craftersmine
31 / 29 / 9
Регистрация: 06.06.2014
Сообщений: 373
12.06.2020, 11:12  [ТС]
Для совместимости с уже написанными скриптами которые так умеют.

В скриптах есть библиотека с методом list. Тоесть вызывается она так
Lua
1
2
3
4
5
6
7
8
9
10
11
local component = require("component");
-- получит таблицу, двумерный массив ключ-значение, ключ является строкой UUID, значение просто строка
local listOfThings = component.list("filter", true); -- или false если только часть фильтра должна совпадать
-- таблицу можно перебрать в for так
for key, value in listOfThings do
    print(key .. " | " .. value);
end
-- но можно пропустить строку с переменной и просто использовать так:
for key, value in component.list() do -- параметры можно не указывать
    print(key .. " | " .. value);
end
0
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,529
Записей в блоге: 9
12.06.2020, 12:15
Не знаю как такое возможно.
Давайте vantfiles позовём.
Или посмотрите исходники этой библиотеки.
0
 Аватар для craftersmine
31 / 29 / 9
Регистрация: 06.06.2014
Сообщений: 373
12.06.2020, 14:43  [ТС]
Нууу... Тут такое дело... Исходники в прямом смысле написаны на Scala. В этом вся и проблема, там это работает, а я пишу на C#/NLua

Добавлено через 20 минут
Вообщем, когда таблицу ставишь в for
Lua
1
2
3
for k, v in table do
    -- что либо
end
то вызывается метаметод __call (метатаблица моя, присваивается к таблице в методе с помощью setmetatable())
Lua
1
2
3
function list_mt.__call(t, k)
    -- выполнить при вызове таблицы в for
end
Я попытался впихнуть туда pairs, ошибка того что возвращаются другие значения
next, зацикливается в этом метаметоде

И в описании библиотеки на офф сайте написано что итератор реализован с помощью метода call, что походу подразумевается что используется этот метаметод. Осталось походу понять как его реализовать, но я не понимаю как

Добавлено через 34 минуты
Да, библиотеке также используется метаметод __call

Я попробовал получить метатаблицу этого метода (с помощью getmetatable(component.list()) из библиотеки и перебрать значения этой метатаблицы. В ней всего лишь один метаметод __call. То есть нужно сделать итератор в этом методе или как-то так чтобы он использовался

Добавлено через 1 час 32 минуты
Вопрос все еще не решен.
0
 Аватар для craftersmine
31 / 29 / 9
Регистрация: 06.06.2014
Сообщений: 373
13.06.2020, 08:49  [ТС]
Все, вопрос решился. Я умудрился найти исходники той библиотеки
Вот как я реализовал эту возможность:
Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function lib.list(filter, exact)
    if filter == nil then filter = '' end;
    if exact == nil then exact = false end;
 
    local list = someClass.getSomeTable(filter, exact); -- получить таблицу
 
    local list_mt = {}; -- метатаблица в которой будет метаметод __call и которая присвоится к таблице "list"
    local key = nil; -- ключ который будет использоваться в итераторе
 
    function list_mt.__call(t) -- сам метаметод __call для таблицы "list" 
        key = next(list, key);
        if key then
            return key, list[key]
        end
    end
 
    return setmetatable(list, list_mt); -- возвращаем таблицу с присвоенной метатаблицей в которой есть метаметод __call
end
И теперь все работает как я и ожидал

Спасибо Curry, за то что пытался помочь)
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
13.06.2020, 09:10
Цитата Сообщение от Curry Посмотреть сообщение
Давайте vantfiles позовём.
Спасибо.
Какая проблема посмотреть на параметры - и вернуть если они есть - таблицу, а если их нет - итератор?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.06.2020, 09:10
Помогаю со студенческими работами здесь

Как сделать таблицу?
Как в WindowsForms сделать такую таблицу, чтобы ее можно было бы заполнить данными, а пользователь бы смог их отредактировать?

Сделать таблицу умножения
Написать программу, которая выводит на экран таблицу умножения.

Сделать сводную таблицу
в макросах человек новый . накопилась проблема. задача: сделать сводную таблицу. Sub Create_PT() Лист3.PivotTableWizard...

Сделать таблицу в консоли
Помогите пожалуйста, не знаю что не так, не могу нормально заполнить таблицу, вроде все есть. Простите что на украинском ...

Как сделать таблицу
Помогите, самостоятельно изучаю HTML. Не могу понять, как сделать так, как на рисунке. Через тег <img> не получается.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru