Lucky
Упс
Lucky
Я думал, что пил и есть мануал.
Lucky
Saphire
Шикарное чтиво :Р
Lucky
А на русском есть?
Saphire
Фиг знает, гугл в помощь
Saphire
Собственно есть, ура.
Lucky
Sergey
как заменить пробелы на %20
Sergey
str = string.gsub(text, "%s+", "\\%20")
Sergey
пробовал так /usr/local/freeswitch/scripts/SMS.lua:57: invalid capture index
Saphire
" "
Sergey
/usr/local/freeswitch/scripts/SMS.lua:57: invalid capture index str = string.gsub(text, "%s+", "%20")
Sergey
также
Sergey
local function replace(str, what, with)
what = string.gsub(what, "[%(%)%.%+%-%*%?%[%]%^%$%%]", "%%%1") -- escape pattern
with = string.gsub(with, "[%%]", "%%%%") -- escape replacement
return string.gsub(str, what, with)
end
result = replace(text, " ", "%20")
Sergey
вот решение
Saphire
...зачем. Что ты делаешь вообще?
Можно пример исходной строки и результата?
Anonymous
Добрый день. Подскажите пожалуйста, как написать виндового демона на lua?
Т.е. висит скрипт который принимает команды и исполняет их при этом не завершаясь .
Ж
while true do
…
end
Snusmumriken
Добрый день. Подскажите пожалуйста, как написать виндового демона на lua?
Т.е. висит скрипт который принимает команды и исполняет их при этом не завершаясь .
Задачка забавная, но обычно требует написания своего интерпретатора (который как раз превращается в сервис).
Ну то есть, допустим, маленькая программка, которая цепляет луа-скрипт и автоматически выполняет. Лучше не в виде while true, а условный скрипт с функцией main, которую интерпретатор дёргает каждый раз в цикле, вместе с приёмом сигналов от ОС. Или с выгрузкой в скрипт функции реакции на эти самые сигналы, чтобы скрипт получился:
while true do
-- your stuff
local event = service_update()
if event == 'EXIT' then os.exit() end
sleep(0.5) -- это тоже стоит выгрузить
end
Так даже лучше, потому что позволяет правильно завершить сервис с луёвой стороны.
https://habr.com/ru/post/71533/
Anonymous
Задачка забавная, но обычно требует написания своего интерпретатора (который как раз превращается в сервис).
Ну то есть, допустим, маленькая программка, которая цепляет луа-скрипт и автоматически выполняет. Лучше не в виде while true, а условный скрипт с функцией main, которую интерпретатор дёргает каждый раз в цикле, вместе с приёмом сигналов от ОС. Или с выгрузкой в скрипт функции реакции на эти самые сигналы, чтобы скрипт получился:
while true do
-- your stuff
local event = service_update()
if event == 'EXIT' then os.exit() end
sleep(0.5) -- это тоже стоит выгрузить
end
Так даже лучше, потому что позволяет правильно завершить сервис с луёвой стороны.
https://habr.com/ru/post/71533/
Спасибо:)
Внесу каплю конкретики.
Это нужно для эффективного взаимодействия между хостовой ОС и гостевой на виртуальной тачке.
Т.е. с хоста посылаются ключи в гостя, а гостевой скрипт обрабатывает эти ключи и что то делает
Andrey
коллеги такой вопрос
Andrey
print (true > false)
Andrey
как сделать что бы работало и выдавало true
Andrey
а не ошибку
mva
это не числа
Andrey
метатаблицу туда можно просунуть ?
Lucky
local true = 1
Lucky
local false = 0
Andrey
:)
fgntfg
Какой грязный хак, мне нравится
Andrey
нет более изящных решений ?
fgntfg
Andrey
не, я не знаю каких типов придут переменные в сравнение и мне нужно понимать что больше а что меньше
Andrey
типа false=0 true>0 1>0
Andrey
проверять тип переменных и делать разные сравнения - мне кажется костыльно
fgntfg
Можно бахнуть всё в си, там, если правильно помню, можно сравнить кто больше среди bool
Andrey
понял. такую хорошую вещь и ... прикрыли - вроде бы логически очевидно что true всегда больше чем false
не буду си - буду тип проверять и переводить в пространство цифр
Andrey
print (tonumber(true))
print (tonumber(false))
еще этот nil
Andrey
со строкой все норм как раз :) и с таблицей
Andrey
print ("A"<"B")
Andrey
подскажите где я здесь ошибся не хочу две проверки делать
Andrey
function isFirstMoreThenSecond(fisrt,second)
for _,v in pairs({first,second}) do
if (type(v)=="boolean") then
if v == false then
v=0
else
v=65535
end
end
end
return first > second
end
Andrey
да я понимаю :)
Andrey
вот такая конструкция получилась как бы ее соптимизировать
Andrey
function toMyNumber(p)
if type(p) == "boolean" then
if p then
return 65535
else
return 0
end
end
return p
end
function isFirstMoreThenSecond(first,second)
local myfirst=toMyNumber(first)
local mysecond=toMyNumber(second)
return (myfirst > mysecond)
end
print (isFirstMoreThenSecond(true,false))
print (isFirstMoreThenSecond(false,false))
print (isFirstMoreThenSecond(true,0))
print (isFirstMoreThenSecond(1,0))
Saphire
Ну
Saphire
В луа можно тернарить:
(condition and value_true or value_false)
Saphire
Мне тоже
Saphire
Что хотел сказать автор вообще?
Snusmumriken
local bool = {}
bool.__index = bool
function bool:__call(v)
return setmetatable({not not v}, self)
end
local function checkSelf(v)
return type(v) == 'table' and getmetatable(v) == bool
end
function bool.__lt(a, b)
if checkSelf(a) then
local v = a[1] and 1 or 0
return v > b
end
local v = b[1] and 1 or 0
return v < a
end
Ехехехе
Saphire
Andrey
О, спасибо за пример!
Lucky
можно тру и фелс в строки перегнать и потом уже сравнивать, если сильно надо
Andrey
Snusmumriken
Но класека — примерно то что ты делал
local function getNum(v)
if type(v) == 'boolean' then
return v and 1 or 0
end
return v
end
print( getNum(true) > getNum(false) ) --> true
Lucky
хех, сила в правде
Andrey
вот, так компактнее, спасибо
Snusmumriken
Можно ещё компактнее.
Lucky
Инстед обновился
Lucky
https://instead-hub.github.io/post/2019-03-08-instead-3-3-0/
Andrey
Можно ещё компактнее.
local function getNum2(v)
return (type(v)=='boolean') and (v and 1 or 0) or v
end
—так ?
Snusmumriken
Ну да, вроде того
Andrey
спасибо!
Snusmumriken
При очень большом желании, вообще все if-els'ы можно заменить на тернарники, но не нужно. И приходится готовить переменные под значения, хехе.
Andrey
еще вопрос
Andrey
--пример 1
local function a()
-- some code
b()
-- some code
end
local function b()
end
--пример 2
local function a()
-- some code
b()
-- some code
local function b()
end
end
Snusmumriken
Форматируй.
Andrey
правильно ли я понимаю что если b - нигде не нужна кроме как в a
Andrey
то тело b - лучше размещать внутри a
Snusmumriken
Выдели кусок кода и нажми ctrl + shift + m
Snusmumriken
Это может привести к просадкам производительности на частом дёргании.
Особенно противно где-то тут:
for i = 1, 1000 do
local func = function(a, b) return a + b end
local v = func(i, i - 10)
local c = func(i + 10, i + 20)
end
Тут создастся тысяча лишних функций. Лучше вынести за цикл.
Andrey
Snusmumriken
Ты с телефона?
Andrey
нет, с компа
Andrey
я понял идею
Andrey
спасибо