Teen_Romance 4 Опубликовано: 14 марта, 2019 Хотел сделать так, чтобы если ячейка сундука пустая, то проверка не выполнялась, но все равно ругается почему то программа Типа если y(nil) тогда не выполнять следующий иф. Как пофиксить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 901 Опубликовано: 15 марта, 2019 @Teen_Romance, замищательно! Держи тяночку. Она тоже искала идшники в таблицах, но что-то пошло не так... 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
man_cubus 28 Опубликовано: 20 марта, 2019 15.03.2019 в 16:02, Teen_Romance сказал: Минуты 2 сидел вчитывался и не мог понять фишку, а потом каааак понял 🤣 На самом деле гениально, просто звучит сложно. Если элемента по такому ключу в таблице не будет то выражение просто будет равно nil ) Сложно как то еще применить но я подумаю) Спасибо большое еще раз Вот тебе еще один способ сравнения: local prefix = "Я знаю, это " local function unknown() print("Об этом я не ничего знаю") end local indexer = { __index = function(self, key) local value = rawget(self, key) if value then return function() print(prefix .. value) end else return unknown end end } local knowns = { ["minecraft:cobblestone"] = "опять чертова кобла", ["minecraft:planks"] = "доски", ["minecraft:tnt"] = "кубик веселья", ["minecraft:log"] = "бревно, как моя бывшая" } setmetatable(knowns, indexer) local me_controller = require("component").me_controller for _, item_stack in pairs( me_controller.getItemsInNetwork() ) do print(item_stack.label, " = ", item_stack.size) knowns[item_stack.name]() end Для того чтоб посмотреть как оно работает, надо подключиться к контроллеру МЭ-сети адаптером. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 20 марта, 2019 Это точно рабочий код? Есть у меня сомнение, хотелось бы развеять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
man_cubus 28 Опубликовано: 20 марта, 2019 7 минут назад, Zer0Galaxy сказал: Это точно рабочий код? Есть у меня сомнение, хотелось бы развеять. Я не тестировал. Каковы сомнения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 20 марта, 2019 Только что, man_cubus сказал: Я не тестировал. Каковы сомнения? Сомнение в том, что __index вызывается только при отсутствии элемента в таблице. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
man_cubus 28 Опубликовано: 20 марта, 2019 6 минут назад, eu_tomat сказал: Сомнение в том, что __index вызывается только при отсутствии элемента в таблице. Неправда t = {1,2,3,4} mt = {__index=function(self, key) v=rawget(self,key) if v then return v else return "shit!" end end } setmetatable(t,mt) for i=1,6 do print(t[i]) end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 20 марта, 2019 @man_cubus И что доказывает этот код? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
man_cubus 28 Опубликовано: 20 марта, 2019 3 минуты назад, eu_tomat сказал: @man_cubus И что доказывает этот код? Действительно, тут нужна прокси таблица. Вот исправленная версия local prefix = "Я знаю, это " local function unknown() print("Об этом я не ничего знаю") end local descriptions = { ["minecraft:cobblestone"] = "опять чертова кобла", ["minecraft:planks"] = "доски", ["minecraft:tnt"] = "кубик веселья", ["minecraft:log"] = "бревно, как моя бывшая" } local indexer = { __index = function(self, key) local value = descriptions[key] if value then return function() print(prefix .. value) end else return unknown end end } local knowns = {} setmetatable(knowns, indexer) local me_controller = require("component").me_controller for _, item_stack in pairs( me_controller.getItemsInNetwork() ) do print(item_stack.label, " = ", item_stack.size) knowns[item_stack.name]() end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 20 марта, 2019 Похоже, ты не уловил сути метатаблиц. Нет, теперь то код рабочий. Но какой смысл в метатаблице если сама таблица knowns не содержит элементов? Просто вызывай функцию __index и всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 20 марта, 2019 Вот я о чем: local knowns = {"A","B","C"} local indexer = { __index = function(self, key) return "unknown" end } setmetatable(knowns, indexer) for i=1,5 do print(knowns[i]) end результат: A B C unknown unknown т..е. __index стреляет только для тех элементов, которые отсутствуют в таблице knowns. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 20 марта, 2019 1 час назад, Zer0Galaxy сказал: теперь то код рабочий. Но какой смысл в метатаблице если сама таблица knowns не содержит элементов? Просто вызывай функцию __index и всё. Если задаваться вопросами о смысле, то какой смысл и в функции __index, если наличие элемента в таблице легко проверяется обычным обращением к самому элементу? Чем это удобнее уже обсуждённой конструкции if tbl[idx] then? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 20 марта, 2019 Это удобней уже тем, что обращений к элементу таблиц в программе может быть множество. И при каждом обращении нужно ставить проверку, "а существует ли такой элемент?". В случае с метатаблицей такую проверку берет на себя Луа. Конечно это никак не ускоряет выполнение программы (наверное), но количество кода сокращает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 20 марта, 2019 16 минут назад, Zer0Galaxy сказал: Это удобней уже тем, что обращений к элементу таблиц в программе может быть множество. И при каждом обращении нужно ставить проверку, "а существует ли такой элемент?". В случае с метатаблицей такую проверку берет на себя Луа. Конечно это никак не ускоряет выполнение программы (наверное), но количество кода сокращает. Да, в определённых случаях метатаблицы, конечно, помогают сократить код. Это понятно. Вопрос в том, как это поможет упросить наш случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 20 марта, 2019 Наш случай это упрощает ровно на один оператор if. Какой в этом смысл не знаю. Не я придумал использовать метатаблицу. Ну, можно почувствовать себя крутым прогером. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
man_cubus 28 Опубликовано: 20 марта, 2019 17 минут назад, Zer0Galaxy сказал: Наш случай это упрощает ровно на один оператор if. Какой в этом смысл не знаю. Не я придумал использовать метатаблицу. Ну, можно почувствовать себя крутым прогером. На самом деле кроме метатаблиц я хотел показать, что можно возвращать не выходные данные в ответ на входные, а функцию-обработчик. В итоге мы для каждого элемента сети тупо делаем knowns[item_stack.name]() и для тех предметов, которые мы определили, мы можем обрабатывать их или единообразно, выводя про них комментарий или неоднородно, в зависимости от типа. В итоге вместо 10 elseif будет 2-3 функции-обработчика, организованных в одну таблицу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 20 марта, 2019 А кто говорил про 10 elseif? Если по простому, то нужно просто принтить содержимое элемента таблицы, а для отсутствующих элементов выводить "Об этом я не ничего знаю" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 748 Опубликовано: 20 марта, 2019 Угу, оберточная функция только занимает память, а к ней еще приколхожен объект, который моментально создается и исчезает. Нужны либо мухи, либо котлеты. А это ниндзя-индусский код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
man_cubus 28 Опубликовано: 20 марта, 2019 Только что, Doob сказал: Угу, оберточная функция только занимает память, а к ней еще приколхожен объект, который моментально создается и исчезает. Нужны либо мухи, либо котлеты. А это ниндзя-индусский код. Да, но для однопоточной ОС без параллелизма может прокатить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Хотел сделать так, чтобы если ячейка сундука пустая, то проверка не выполнялась, но все равно ругается почему то программа
Типа если y(nil) тогда не выполнять следующий иф.
Как пофиксить?
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах