Kirill
local func, err = loadstring("print(10)") func() > 10
Есть примеры как require переопределяют?
Snusmumriken
Есть примеры как require переопределяют?
Например, вот так можно описать require без кеширования скриптов. function MyRequire(scriptname) local root = "c:/bin/lua" local path = root .. "/" .. scriptname .. ".lua" local file = assert( io.open(path, 'rb') ) local code = file:read("*all") file:close() -- err - ошибка в коде при парсинге файла -- scriptname передаётся -- чтобы текст ошибок был привязан к -- scriptname, а не "ошибка в чанке кода" local func, err = loadstring(code, scriptname) if not func then error(err) end return func() end
Snusmumriken
А зачем тебе переопределять require?
Kirill
Ок, спасибо.
Snusmumriken
Для добавления новых директорий поиска скриптов есть package.path
Snusmumriken
Переопределение require должно быть необходимо только для очень специфических задач, например "подключение зашифрованного скрипта", или "подключение к FTP серверу, загрузка оттуда скрипта и исполнение"
Snusmumriken
Ок, спасибо.
Зачем оно таки тебе нужно?
Kirill
Чтоб пользоваться LRDB
Snusmumriken
А, тощна
Kirill
Скрипты на Linux
Kirill
Отладка удаленная
Kirill
Началбные скрипты через строку гружу
Kirill
Их видно, а остальное = не может найти
Snusmumriken
Он именно найти не может?
Snusmumriken
Пишет типа "скрипт не найден"?
Kirill
Kirill
Сорян за качество
Snusmumriken
Ну а почему он не может его прочитать?
Snusmumriken
Он там точно есть? Насколько я помню, что в линуксах регистр путей имеет значение.
Arslan
Это же окна
Snusmumriken
Тут удалёнка.
Snusmumriken
Дебаггер под вендой, исполнение на линуксовой стороне.
Arslan
А
Kirill
Я насколько понял он файл пытается локально открыть, а строки пересылает
Kirill
Может правильнее в LRDB залезть будет
Snusmumriken
На исполняющей стороне находится полный комплект скриптов? Всё что нужно?
Kirill
Да
Snusmumriken
Тогда почему не открывает? Проверь все пути.
Kirill
Пути верные, работает через sudo
Ameliance
#вопрос эта штука function Element:new_elem(x_btn_position, y_btn_position) Отличается от этой function Element.new_elem(x_btn_position, y_btn_position) и подразумевает это? function Element.new_elem(Element, x_btn_position, y_btn_position)
Snusmumriken
Ответы на все твои вопросы — "Да"
Snusmumriken
Но последнее я бы поправил на: "подразумевает вот это: function Element.new_elem(self, x_btn_position, y_btn_position)
Ameliance
я просто читал про это, но не понял, считается ли при таком раскладе аргумент arg как второй Element:new_elem(arg)
Snusmumriken
Считается как второй, потому что первый — таблица перед двоеточием.
Ameliance
я думал она как бы фоном идет как self и не попадает под счет
Snusmumriken
Self — это такой же аргумент как и остальные. Просто с двоеточием — оно автоматически провешивается и при определениях функций, и при вызовах.
Ameliance
это хорошо, на один вопрос меньше на пути к пониманию того, что я наворотил)))
Snusmumriken
Статью глянь, я её не просто так писал )) Заодно по метатаблицам прошвырнёшься.
Ameliance
Статью глянь, я её не просто так писал )) Заодно по метатаблицам прошвырнёшься.
Да, спасибо, уже добавил в закладки и сохранил как хтмл) Мне эту тему очень важно сейчас понять)
Snusmumriken
Да, да.
Ameliance
Да, да.
в первом вопросе есть или
Snusmumriken
Ответ на оба вопроса.
Snusmumriken
mt = {__index = foo} -- это обычный конструктор таблиц, то что написано на упаковке. А setmetatable возвращает первый переданный в неё аргумент.
Ameliance
Ответ на оба вопроса.
1. одновременно присваиваются значения и добавляются ключи?
Snusmumriken
Не бывает ключа без значения (точнее, бывает, но всё неопределённое — nil). Создаётся табличка и наполняется ключами-значениями.
Snusmumriken
Ну ты же знаешь что можно делать так: t = {1, 2, 3, 4, 5}? Это примерно то же что и t = {[1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 5} На самом деле не в точности то же (байткод чуть-чуть разный), но для тебя разницы тут никакой нет.
Snusmumriken
И вот в том случае — мы такие: mt = { __index = foo, -- или ["__index"] = foo, }
Ameliance
mt = {__index = foo} -- это обычный конструктор таблиц, то что написано на упаковке. А setmetatable возвращает первый переданный в неё аргумент.
я просто привык его видеть как-то так (функцию, которую я одолжил, когда делал библиотеку для кнопок.. теперь хочу понять как оно работает)
Snusmumriken
Ну вот тут при каждом extend — создаётся таблица, которая цепляется метатаблицей к Child, и указывает Child'у искать недостающие ключи по __index в Parent.
Snusmumriken
Фигурные скобочки — это конструктор таблиц. При каждом использовании фигурных скобочек — создаётся новая таблица. Её можно заполнять ключами как в процессе инициализации, так и после.
Snusmumriken
А вот так делать нельзя: foo = {key = foo} Потому что значение, присваиваемое key к моменту присваивания ещё не создано )) Только так: foo = {} foo.key = foo
Ameliance
вот мой сильно урезанный код из библиотеки... вроде пару строчек, но мозг уже рушится, местами никак не могу понять что местами происходит
Arslan
Можно ли создать создать таблицу (средствами луа), которая полностью копирует строки луа, но хранится будет в utf-8?
Snusmumriken
вот мой сильно урезанный код из библиотеки... вроде пару строчек, но мозг уже рушится, местами никак не могу понять что местами происходит
А, это уже для самостоятельной работы. Если я буду объяснять, ничего понятнее не станет. Первым делом, попробуй убрать двоеточия, и заменить их точками с self при инициализации, и точкой с elem при вызове.
Arslan
Да
Snusmumriken
Можно.
Ameliance
А, это уже для самостоятельной работы. Если я буду объяснять, ничего понятнее не станет. Первым делом, попробуй убрать двоеточия, и заменить их точками с self при инициализации, и точкой с elem при вызове.
да, в комментариях себе так упрощяю... пока мозг на лету не воспринимает тратата.тата и тарата['тата'], как нечто разное не говоря о двоеточиях😅
Snusmumriken
Да
Цепляй библиотеку utf8, разделяй посимвольно чем-то таким: local utf8 = require'utf8' local t = {} for code in utf8.codes("Привет") do local char = utf8.char(code) table.insert(t, char) end
Arslan
По-моему она криво разделяет юникод
Snusmumriken
Намана разделяет, на моей практике по крайней мере.
Snusmumriken
Плюс таких либ довольно много.
Snusmumriken
Но ты учитывай что юникод тоже не пальцем деланный. Составные символы/лигатуры никуда не деваются, и оказываются неотображаемыми символами.
Arslan
В этом проблема была
Snusmumriken
Поэтому сначала надыбай что-то для нормализации юникода. В целом, любому кто работает с юникодом надо бы прочитать его спецификацию. Юникод _сложен_.
Snusmumriken
почему тут function extended(Child, Parent) setmetatable(Child,{__index = Parent}) end нельзя сделать так? function extended(Child, Parent) setmetatable(Child, Parent) end
Если у Parent есть поле __index, являющееся Parent'ом — можно, ничего не изменится.
Ameliance
ох... почему так сложно то...
Snusmumriken
Условно, при использовании __index есть три таблицы: 1. Таблица, в которой ищут недостающие ключи (Parent) 2. Метатаблица, которая указывает поведение тех кто к ней прицеплен (через __index) 3. Табличка, которая ищет недостающие ключи (Child)
Snusmumriken
ох... почему так сложно то...
Не бойся, когда я начинал изучать — я подходил к метатаблицам раз пять на протяжении полугода. А потом прям вкурил и написал статью. Статья уменьшает количество подходов вдвое.
Snusmumriken
А потом метатаблички стали простыми и приятными : )
Snusmumriken
а если нет, то зачем тогда тут __index
Потому что это метатаблица. Она задаёт поведение объектов которые к ней прицеплены через специальные ключи типа __index. Если просто задать метатаблицу — поведение оригинальной таблицы не изменится никак, она не начнёт искать ключи в метатаблице.
Ameliance
то есть если я после этого setmetatable(Child,{__index = Parent}) я обращаюсь к Child.x, то в начале оно поищет x в Child, если не найдет, то в Parent, а затем в __index, которая в является метатаблицей Parent?
Snusmumriken
mt = {} mt.a = 10 mt.b = 20 tbl = {a = 100} -- задаём поведение tbl по модели mt setmetatable(tbl, mt) ------------ -- в mt ничего нет, она не меняет поведение tbl print(tbl.a) --> 100 print(tbl.b) --> nil ------------ -- теперь в mt есть управляющий ключ, -- она меняет поведение подчинённых табличек -- подчинённые теперь ищут недостающее в mt -- (это может быть и другая таблица) mt.__index = mt print(tbl.a) --> 100 print(tbl.b) --> 20