Anonymous
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
нормал мне подходит, спасибо
Snusmumriken
парни, можно как-то сделать, чтобы не делать:
setmetatable(Ema, {
__call = function(cls, ...)
local self = setmetatable({}, cls)
self:new(...)
return self
end
})
хочу, чтобы клиентский код вот так работал:
local ema = Ema:new(3) -- а не
local ema = Ema(3)--как с __call
function Ema:new(a, b, c)
self = setmetatable({}, self)
self.x, self.y = a, b+c
return self
end
setmetatable(Ema, {__call = Ema.new})
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", но остальное там примерно такое же.
Hello, World! 🎄
Snusmumriken
Нет.
Hello, World! 🎄
Snusmumriken
Взять и установить ))
Snusmumriken
Берёшь такой и ставишь. У тебя какой интерпретатор? Чистый? Стороннее приложение? Какая ОС? Какая разрядность интерпретатора? Какая версия интерпретатора с точностью до минорной?
Hello, World! 🎄
vvzvlad
Snusmumriken
чистый, оффициальный
Кароч, вот это вот:
https://github.com/diegonehab/luasocket
А для https ещё и вот это:
https://github.com/brunoos/luasec
Компилишь под свою версию луа, используя заголовки и твою lua5.N.lib/dll/so.
Под ту же разрядность.
Hello, World! 🎄
Snusmumriken
Luasec под вендой ещё хочет libeay32.dll и ssleay32.dll, добудь где-нибудь. Под линуксами проще, там встроенный в ос openssl.
Hello, World! 🎄
Snusmumriken
Тогда ещё проще.
sudo apt-get install luarocks
sudo luarocks install luasocket
sudo luarocks install luasec
Hello, World! 🎄
Snusmumriken
Ага. Если не найдёт пути до либ — пропишешь в LUA_PATH/LUA_CPATH.
Hello, World! 🎄
Yaroslav
Друзья, я давал ссылку на туториал lua . org/pil/11.5.html =) А вопрос у меня был такой, в чем глубинный смысл присваивать логический тип true каждому элементу списка, чтобы найти вхождение элемента в этот список? Разве само его наличие в списке не должно означать, что он тру?
Snusmumriken
Snusmumriken
Вот такое?
local set = {
a = true,
b = true,
foo = true
}
if set.foo then ... end
Yaroslav
и почему вот так не работает:
emergency ='78232','7823','7825'
local lactac = '7823'
if emergency[lactac] then
print "true"
else
print "false"
end
Snusmumriken
Так вот, это не список, это хеш-мапа которая используется как сет.
Но у хеш-мапы должны быть и ключ и значение.
Yaroslav
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
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
У луа нет списков. Есть массиво-дикты, которые одновременно массивы и одновременно дикты. Используй массив как список, если важен порядок. Или дикт-сет, если порядок не важен но нужна уникальность.
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