Kirill
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 серверу, загрузка оттуда скрипта и исполнение"
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
Ameliance
Snusmumriken
Ответы на все твои вопросы — "Да"
Snusmumriken
Но последнее я бы поправил на:
"подразумевает вот это:
function Element.new_elem(self, x_btn_position, y_btn_position)
Arslan
Ameliance
я просто читал про это, но не понял, считается ли при таком раскладе аргумент arg как второй
Element:new_elem(arg)
Snusmumriken
Считается как второй, потому что первый — таблица перед двоеточием.
Ameliance
я думал она как бы фоном идет как self и не попадает под счет
Snusmumriken
Self — это такой же аргумент как и остальные. Просто с двоеточием — оно автоматически провешивается и при определениях функций, и при вызовах.
Ameliance
это хорошо, на один вопрос меньше на пути к пониманию того, что я наворотил)))
Snusmumriken
Статью глянь, я её не просто так писал ))
Заодно по метатаблицам прошвырнёшься.
Ameliance
Snusmumriken
Да, да.
Ameliance
Да, да.
в первом вопросе есть или
Snusmumriken
Ответ на оба вопроса.
Snusmumriken
mt = {__index = foo} -- это обычный конструктор таблиц, то что написано на упаковке.
А setmetatable возвращает первый переданный в неё аргумент.
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
Snusmumriken
Ну вот тут при каждом extend — создаётся таблица, которая цепляется метатаблицей к Child, и указывает Child'у искать недостающие ключи по __index в Parent.
Snusmumriken
Фигурные скобочки — это конструктор таблиц. При каждом использовании фигурных скобочек — создаётся новая таблица. Её можно заполнять ключами как в процессе инициализации, так и после.
Snusmumriken
А вот так делать нельзя:
foo = {key = foo}
Потому что значение, присваиваемое key к моменту присваивания ещё не создано ))
Только так:
foo = {}
foo.key = foo
Ameliance
вот мой сильно урезанный код из библиотеки... вроде пару строчек, но мозг уже рушится, местами никак не могу понять что местами происходит
Arslan
Можно ли создать создать таблицу (средствами луа), которая полностью копирует строки луа, но хранится будет в utf-8?
Snusmumriken
Arslan
Да
Snusmumriken
Можно.
Ameliance
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
Arslan
В этом проблема была
Snusmumriken
Поэтому сначала надыбай что-то для нормализации юникода.
В целом, любому кто работает с юникодом надо бы прочитать его спецификацию.
Юникод _сложен_.
Ameliance
Snusmumriken
Ameliance
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