Snusmumriken
ты сам его сделал? можешь поделиться?
Оно у меня под 32-разрядный вендовый luajit. Но там прост берёшь текущую рабочую директорию и пытаешься исполнить файл main.lua из неё через luaL_dofile.
Anatoliy
Всем привет, ребяты подскажите по такому вопросу, впервый раз столкнулся с проблемой - есть либа dll, компилил из исходников сам, с помощью MS Visual Studio 2019, для 32х битного луа она подключается с помощью require отлично и все работает без проблем, захотел начать её юзать в 64-х битном луа, перекомпилил в студии либу под 64 бит, подключаю либу с скрипте с помощью require - и скрипт выдает ошибку прямо на этой строчке с require - attempt to index global 'имя либы' (a boolean value)
Anatoliy
Загуглил ошибку - оказывается случается она у людей часто с самыми разными либами и модулями, необязательно с бинарными, даже с lua модулями подключаемыми с помощью require
Anatoliy
Например вот - https://stackoverflow.com/questions/27458453/attempt-to-index-local-a-boolean-value
Anatoliy
Там человек подключал модуль - local game = require("data.game_model")
Anatoliy
и ему выкинуло ошибку - Attempt to index local 'game' (a boolean value)
Anatoliy
И ответ ему был таков:
Anatoliy
It means that the module data.game_model did not return anything when it was loaded. In this case, require returns true.
Anatoliy
Т.е. загружаемый с помощью require модуль не вернул ничего, а должен вернуть true, поэтому и ошибка
Anatoliy
В итоге они там скрипт data.game_model.lua переделали и он стал выдавать при помощи require то что нужно, но у меня то не скрипт на луа у меня бинарник dll как я его переделаю? Переделывать исходники на Си чтоли? И почему же тогда этот бинарник скомпиленный под 32бита не выдавал никакой ошибки?\
Anatoliy
Да уже непомню )))) Давненько, а под 64 на днях только
Anatoliy
Напишу вообщем разрабу на гитхаб
Anatoliy
либа .lib?
Anatoliy
Вероятно косячнул чтото щас буду смотреть
Anatoliy
Кажется нашел в чем косяк, теперь другой вопрос в связи с этим, подскажите как правильно компилить с модулем - compat-5.3, слышал про это не еще не вникал, это я так понимаю модуль для совместимости скомпиленного под луа 5.1 но чтобы и в луа 5.3 этот модуль потом подключить можно было
Anatoliy
Вроде перекомпилил, да был тим косяк - я прикрутил к проекту lua5.1.lib от 32х битного луа, странно а почему же тогда все компилится без проблем, ладно прикрутил lua5.1.lib от 64х битного луа, перекомпилил, и опять в скрипте та же ошибка - attempt to index global 'имя либы' (a boolean value)
Anatoliy
Он с исходниками от луа 5.1 вообще не компилится, я его скомпилил с исходниками от луаджит, он тоже ведь 5.1 но там почему то есть недостающие функции на отсутствие которых проект ругается, в частности функция - lual_testudata - её нет в луа 5.1 но она есть в луа 5.3 и есть в луаджите 5.1
Anatoliy
при том что скомпиленная таким образом нужная мне либа под 32 бит и в луаджите и в обычном луа 5.1 грузится и рботает без проблем
Anatoliy
https://github.com/zhaozg/lua-openssl
Anatoliy
луаджит 64 бита у меня итак уже есть
Anatoliy
Да
Ivan
парни, можно как-то сделать, чтобы не делать: setmetatable(Ema, { __call = function(cls, ...) local self = setmetatable({}, cls) self:new(...) return self end }) хочу, чтобы клиентский код вот так работал: local ema = Ema:new(3) -- а не local ema = Ema(3)--как с __call
Ivan
и чтобы не делать в самой функции new() реализацию всех методов
Ivan
грубо говоря, мне метатаблица и __call не нужны
Ivan
но не хочу такой библиотечный код: function Ema:next() end function Ema:reset() end function Ema:new(period) local ema = {} ema.next = self.next --link to function ema.reset = self.reset --link to function return ema end
Ivan
то есть я понимаю, что надо пройтись циклом по self и скопировать в ema все key/value
Vladislav
Ну, что-нибудь типа этого можно: local Ema = {} local methods = {} local metatable = { __index = methods } function methods:reset() end function methods:next() end function Ema:new() return setmetatable({}, metatable) end return  setmetatable(Ema, { __call = Ema.new })
Vladislav
Или хотите совсем без метатаблиц, просто методы скопировать в объект?
Ivan
можно с ними)
Ivan
нормал мне подходит, спасибо
Ivan
где?
Ivan
ладно, я понял
Snusmumriken
Ну прост Ema теперь можно вызывать как Ema:new(a, b, c) и как Ema(a, b, c) с идентичным результатом.
Ivan
не, лан
Hello, World! 🎄
Кто подскажет как отправлять запросы на сервер get, post ?
Snusmumriken
Кто подскажет как отправлять запросы на сервер get, post ?
luasocket: local http = require"socket.http" local response, status, headers = http.request{ url = "http://yandex.ru" verb = "post", body = "hello", } Для https — ещё и luasec, а вместо require"socket.http" — require"ssl.https", но остальное там примерно такое же.
Snusmumriken
Нет.
Hello, World! 🎄
Нет.
А как установить?
Snusmumriken
Взять и установить ))
Hello, World! 🎄
Взять и установить ))
А как это будет на луа?
Snusmumriken
Берёшь такой и ставишь. У тебя какой интерпретатор? Чистый? Стороннее приложение? Какая ОС? Какая разрядность интерпретатора? Какая версия интерпретатора с точностью до минорной?
Snusmumriken
чистый, оффициальный
Кароч, вот это вот: https://github.com/diegonehab/luasocket А для https ещё и вот это: https://github.com/brunoos/luasec Компилишь под свою версию луа, используя заголовки и твою lua5.N.lib/dll/so. Под ту же разрядность.
Snusmumriken
Luasec под вендой ещё хочет libeay32.dll и ssleay32.dll, добудь где-нибудь. Под линуксами проще, там встроенный в ос openssl.
Snusmumriken
Тогда ещё проще. sudo apt-get install luarocks sudo luarocks install luasocket sudo luarocks install luasec
Hello, World! 🎄
Snusmumriken
Ага. Если не найдёт пути до либ — пропишешь в LUA_PATH/LUA_CPATH.
Yaroslav
Друзья, я давал ссылку на туториал lua . org/pil/11.5.html =) А вопрос у меня был такой, в чем глубинный смысл присваивать логический тип true каждому элементу списка, чтобы найти вхождение элемента в этот список? Разве само его наличие в списке не должно означать, что он тру?
Snusmumriken
Вот такое? local set = { a = true, b = true, foo = true } if set.foo then ... end
Yaroslav
Дай пример кода, что именно имеешь ввиду под "элементами списка".
emergency = {['78232'] = true, ['7823'] = true, ['7825'] = true} local lactac = '7823' if emergency[lactac] then print "true" else print "false" end
Yaroslav
и почему вот так не работает: emergency ='78232','7823','7825' local lactac = '7823' if emergency[lactac] then print "true" else print "false" end
Snusmumriken
Так вот, это не список, это хеш-мапа которая используется как сет. Но у хеш-мапы должны быть и ключ и значение.
Snusmumriken
и почему вот так не работает: emergency ='78232','7823','7825' local lactac = '7823' if emergency[lactac] then print "true" else print "false" end
Вот это не работает потому что тут emergency это не таблица. Ты присваиваешь ей строку '78232'. Вообще, оно должно было бы упасть, но не падает потому что у строк есть ключи-строковые методы чтобы можно было делать: str = "foo" print(str:find("o")) --> 2 2 Поэтому у строк как бы можно пытаться взять ключ, но это бесполезно.
Snusmumriken
set[lactac]. Ты ведь пытаешься выдрать по значению переменной. set.lactac == set['lactac'], что совсем не set['foo'], оно же set.foo.
Snusmumriken
Доступ к полям через точку — сокращение для строковых ключей.
Snusmumriken
local set = { a = true, b = true, foo = true, ["foo"] = true -- то же самое } -- это всё - одно и то же if set.foo then ... end if set["foo"] then ... end local lactac = "foo" -- по значению переменной if set[lactac] then ... end
Yaroslav
а если мне надо найти, содержится ли b в: set = {a,b,c,d,e} ?
Snusmumriken
for i = 1, #set do if b == set[i] then return true end end
Snusmumriken
Потому что set = {a,b,c,d,e} это чистый незамутнённый массив со значениями переменных a, b, c, d и e, а не хеш-мапа.
Yaroslav
for i = 1, #set do if b == set[i] then return true end end
что-то тут не работает, я нее понимаю :(
Snusmumriken
Это должно быть функцией.
Snusmumriken
чот такое function find_in_array(arr, v, offset) for i = offset or 1, #arr do if arr[i] == v then return i end end return nil end
Snusmumriken
что-то тут не работает, я нее понимаю :(
Больше экспериментируй. Допустим, у нас вот такой код: b = 10 set = {a, b, c, "d", e} print( set[1] ) --> nil print( set[2] ) --> 10 print( set[3] ) --> nil print( set[4] ) --> d print( set["a"] ) --> nil print( set.b ) --> nil Это массив. Тут только числовые ключи. В полной записи оно выглядело бы как set = {[1] = a, [2] = b, [3] = c, [4] = "d", [5] = e}
Yaroslav
попробую переварить) после питоновского for item in array, как-то сложно
Snusmumriken
В луа есть for i, item in ipairs(array) do, что есть примерно то же но лучше (ибо встроенный счётчик).
Yaroslav
А if item in list нет?
Snusmumriken
Теперь давай вот так: b = 10 set = {a = 1, b = 2, ["c"] = 3, "d", [b] = 4, "e"} ^ хеш ^ хеш ^ хеш ^массив ^ хеш ^ массив -- "e" = "bar" -- ошибка синтаксиса, нужно точно определить что "e" это ключ print( set[1] ) --> "d" -- потому что оно попало в массивную часть print( set[2] ) --> "e" print( set.a ) --> 1 print( set.b ) --> 2 print( set.c ) --> 3 print( set['c'] ) --> 3 -- то же самое print( set[b] ) --> 4 -- [b] это [10] print( set[10] ) --> 4
Snusmumriken
А if item in list нет?
Нет. Есть if set[item] then
Snusmumriken
У луа нет списков. Есть массиво-дикты, которые одновременно массивы и одновременно дикты. Используй массив как список, если важен порядок. Или дикт-сет, если порядок не важен но нужна уникальность.
Yaroslav
я еще не могу оценить, что эффективней, использование такой записи lua . org/pil/11.5.html кажется максимально простой и эффективной, когда у меня есть возможность вручную словарь прописать
Snusmumriken
Ты про это? function Set(list) local set = {} for _, l in ipairs(list) do set[l] = true end return set end