Size: a a a

2021 July 13

L

Leon174 in pro.lua
Всем привет, но никого нет, вымерли.

Я такого не встречал. Если только самому написать. Lua2Lua transpiler, забавно, наверное.
источник

T

Tverd in pro.lua
ну есть варианты luamacro, думал можно обойтись готовыми вещами )
источник

T

Tverd in pro.lua
а так да, lua2lua что-то должно быть... туда бы еще отключение и включение ассертов
источник

L

Leon174 in pro.lua
Может metalua?
источник

S

Snusmumriken in pro.lua
Сделай
local t = setmetatable({}, {__index = table})
И будет работать.

Или даже

local arrmt = {__index = table}
function array(t)
 return setmetatable(t or {}, arrmt)
end

Тогда будешь мутить всякие массивы с arr:insert()/arr:remove().
источник

L

Leon174 in pro.lua
Блин, столько интересного тогда было, такой движ был и как отрезало. Привет Иерусалимски и его папско-каталической бурсе.
источник
2021 July 15

m

mds in pro.lua
Всем привет, есть ли какой-нибудь адекватный способ узнать количество элементов в не индексированном массиве. Также интересно понимать как находить последний элемент такого массива.
pairs() ведь как-то понимает, что нужно остановится.
Буду весьма признателен за ссылку на почитать или за разъяснения
источник

m

mds in pro.lua
по второму вопроcу нашел у себя же в старом коде вот такой хук или костыль:
Внутри цикла for с pairs() проводить проверку на последний элемент массива:
if (next(table, key) == nil)
источник

m

mds in pro.lua
А длинну видимо только счётчиком, перебрав все элементы (
источник

S

Snusmumriken in pro.lua
Ничего страшного, всё нормально.

function table.hlen(tbl)
 local i. k = 0, next(tbl)
 while k do
   i = i + 1
   k = next(tbl, k)
 end
 return i
end
источник

AG

A G in pro.lua
Здравствуйте, коллеги!
Начинаю изучать применение lua в различных железках ))
Прошу помощи в правильной организации telnet-соединения!!
Суть в чём, две железки должны общаться передавая короткие команды раз в 10..15 минут. Помимо сообщений о текущем состоянии необходимо изредка (40..60 сек) отправлять дополнительные запросы.
Напрашивается простая схема типа:

local socket = require("socket")
local host = hostIP
local port = 23
local tcp = assert(socket.tcp())
tcp:connect(host, port)
---
while tcp do
    local res, err = tcp:receive()
    dosomething(res, err)
    local command = GetComm()
    tcp:send(command..'\r\n')
end


И вот тут возникает засада ((
Пока сообщения идут с маленьким перерывам, всё ок. А как только перерыв между сообщениями увеличивается до нескольких минут, всё, ждём пока что-либо не будет принято...
Подскажите, плз, какие есть способы преодолеть это?
источник

ШТ

Шмель Тяжеловес... in pro.lua
Вам для начала нужно выставлять тайм-аут сокета при получении данных. Начните с документации luasocket на settimeout. А потом менять цикл обработки.
источник

AG

A G in pro.lua
Пробовал так:
...
tcp:connect(host, port)
tcp:settimeout(5)
...

После этого соединение рвётся.
источник

S

Snusmumriken in pro.lua
Сокет работает в двух режимах: с бесконечной блокировкой и с таймаутом.
С блокировкой - сокет блокирует соединение пока не примет что-нибудь, и tcp:receive() без аргументов ждёт разрыва соединения. Чтобы принять строку с разделителем \r\n — используй tcp:receive("*l").

Второй вариант — сокеты с таймаутом, там если ничего не пришло по таймеру — соединение отпускает, и может идти дальше, например проверять другие соединения.
источник

S

Snusmumriken in pro.lua
Соединение не рвётся. Просто тебе нужно сделать цикл tcp:receive(), когда что-то придёт — оно тебе обязательно скажет, и в цикле ты можешь делать что-то ещё помимо сетевого соединения.
источник

S

Snusmumriken in pro.lua
А статус соединения лежит как раз в err при receive, если оно прекращено — напишет не timeout а closed.
источник

AG

A G in pro.lua
Спасибо!!
Сейчас попробую ))
источник

S

Snusmumriken in pro.lua
local socket = require("socket")
local host = hostIP
local port = 23
local tcp = assert(socket.tcp())
tcp:settimeout(0)
local status = tcp:connect(host, port)

---
while status ~= 'closed' do
    -- команды telnet однострочные,
    -- поэтому "*l", т.е. line
    local data
    data, status = tcp:receive("*l")
    if data then
       dosomething(data, status)
    end
    local command = GetComm()
    if command then
      tcp:send(command..'\r\n')
    end
    socket.sleep(0.03)
end
источник

S

Snusmumriken in pro.lua
источник

AG

A G in pro.lua
🙏
источник