Александр
а возвращает то nil то результат вида function: 0xfae4a0
Александр
хотя если вставить в цикл for или while то всё ок
Александр
надо как то явно указать тип возвращаемого значения?
Highly Likely
Highly Likely
Что можно было легко прочитать погуглив функцию
Highly Likely
Тебе нужен string.match
Александр
я час читал
Александр
но все примеры как назло с циклом
Highly Likely
Highly Likely
Александр
или с вырезанием цифр где типа по их примеру якобы годится local a,b = string.gmatch
Highly Likely
Highly Likely
Александр
да все примеры как раз как на картинке. с for и.т.п.
Highly Likely
Внимательно посмотри :/
Highly Likely
И прочитай что написано на картинках
Александр
мне надо просто user@domain разделить на первое и второе :-)
Александр
желательно сразу в 2 переменные. без всяких for итп
Highly Likely
Highly Likely
Чем, по-твоему, отличаются string.match и string.gmatch?
Александр
ну судя по скрину мне вообще string.format нужен
Александр
чем отличается не знаю , я последний раз lua лет 7 нааад щупал и то немного
Highly Likely
:/
Highly Likely
Александр
спасибо все ок
Александр
близко к тому. но я человек , замученный нарзаном
Александр
37
Highly Likely
Тогда вопросов нет :)
Александр
первый раз в жизни меня по моему из гуру списали в динозарвы
Snusmumriken
мне надо просто user@domain разделить на первое и второе :-)
Карочи.
local str = "qwe=bla; re=wer"
Чтобы найти первое вхождение:
local a, b = str:match("(%w+)=(%w+)")
Чтобы найти последнее вхождение:
local a, b = str:match("(%w+)=(%w+)$")
Чтобы найти все вхождения:
local list = {}
for a, b in str:gmatch("(%w+)=(%w+)") do
list[#list + 1] = {a, b}
end
Match — поиск. Gmatch — "глобальный" поиск (с итератором).
Соответственно тебе —
local mail = "user@domain.com"
local user, site = mail:match("(%a+)@(%a+%.%w+)")
%a — потому что alphanumerical: pupkin2003@777casino777.blah
В целом, нормальная регулярка почты офигительно сложная (ибо почта поддерживает миллиард расширений и в целом плохо вписывается), поэтому остаётся не морочиться и взять просто то что слева и справа от собаки. Ну я тут ещё проверяю домен.
Александр
ну я умом как бы понимаю, что иттератор это видимо то что не вычисляется полностью а формируется по мере обработки предыдущих значений запроса
Александр
но вроде я не помню другие языки где для этого была бы отдельная от обычного массива результатом сущность
Александр
чтоб нельзя было обращаться просто по значению
Highly Likely
Highly Likely
В данном случае – gmatch создает фунцию, вызов которой последовательно возвращает вхождения регулярки в тексте
Александр
вроде только в обьектных классах php с таким сталкивался давно
Александр
больше даж не припомню где
Anonymous
А у нас тут 4е издание Роберто на русском не завалялось случаем ?
Snusmumriken
Жуть какая. Попробуй второе на русском, а четвёртое на английском. Там не очень большая разница.
Anonymous
Тут у нас есть 3- е на русском :)
Anonymous
В ней описывается версия 5.2. А в 4м издании речь идет наверное о 5.3 ?
Snusmumriken
Сопоставления, помнится:
1 | 2 | 3 | 4
5.0|5.1|5.2|5.3
Так что да.
Snusmumriken
Я прост не очень понимаю, зачем четвёртое, и зачем на русском : )
Мне в своё время хватило 5.1 для всего, плюс прочитать все отличия 5.3 в онлайн-доке. С учётом того что я с английским сильно на "вы", там фактически симпл-инглиш. А переводы страдают отсебятиной и всякой такой ерундой.
Snusmumriken
Или это для других?
Anonymous
Оки
Anonymous
Тем более я не pro.lua а nubie.pro.lua
Anonymous
Товарисчи, поясните пжлст , что будет в переменой list после выхода из цикла:
Anonymous
list = nil
for line in io.lines() do
list = {val = line, next = list}
end
Anonymous
Читаю про итератор для обхода связанного списка , но не пойму как в этом цикле строится этот список. На первый взгляд кажется, что в переменой list будет только последняя считанная строка...
Highly Likely
Тут темная магия, которую в таком виде лучше не использовать
Highly Likely
Мы сохраняем в list ссылку на предыдущий элемент
Highly Likely
Т.к. ссылка изменится после того, как конструктор выполнится :)
Snusmumriken
Ух какая чёрная магия
Snusmumriken
Можно будет потом мутить проход по этому "списку" вот так вот:
-- дублируем ссылку отдельно,
-- чтобы первый элемент list не потерялся
-- а то профукаем весь список
local v = list
while v do
local line = v.line
.. some stuff with line
v = list.next
end
Фактически, это (одно)связный список.
Snusmumriken
list = nil
for line in io.lines() do
list = {val = line, next = list}
end
Попробуй взять какую-нибудь библиотеку сериализации и попробовать напечатать list. Там будет сильно вложенная структура типа:
list = {
line = "bar",
next = {
line = "foo",
next = {
line = "yo",
next = ...
}
}
}
(это на ввод yo\nfoo\nbar, т.е. порядок обратный)
И в процессе его составления вот этим вот io.lines, ссылка list принимает в себя новую табличку, а старая пихается в next этой новой таблички.
Anonymous
Кажется просветление уже близко (смутило , что в ключе с именем next ссылка не на следующий , а на предыдущий "узел". Пытаюсь в этом недоинтерпретаторе ( qlua)
скомпилить пример, но не могу понять какой управляющий символ скормить консоли, чтобы она поняла , что поток ввода для io.lines окончен
Snusmumriken
Ты используй io.lines на файлы, а то оно так и будет требовать ввода, пока ты не брейкнешь, помнится.
Snusmumriken
Ты типа такой:
if line == 'stop' then break end
Или просто на пустую строку проверка.
Anonymous
Anonymous
Anonymous
/help@FailsBot
Snusmumriken
Привет @dasertuoi, расскажи немного о себе.
Anonymous
Это я пытаюсь найти каким тегом обернуть код, для читаемости
Anonymous
Anonymous
Чтобы не pastebin-нить
Snusmumriken
Привет
Зачем прибыл? У тебя какие-то вопросы по Lua? : )
Snusmumriken
Anonymous
local function getnext (list, node)
if not node then
return list
else
return node.next
end
end
function traverse (list)
return getnext, list, nil
end
list = nil
for line in io.lines() do
list = {val = line, next = list}
if line == 'stop' then break end
end
for node in traverse(list) do
print(node.val)
end
Snusmumriken
Ух, итераторы
Anonymous
🧠 взорвался на главе про итераторы. Тяжеловато , но мощно
Snusmumriken
Но в целом можно попроще:
local function traverse(list)
-- чтобы не пропускала первый элемент
-- ибо мы сначала переключаем а потом возвращаем
local n = {next = list}
return function()
n = n.next
-- когда next закончатся -
-- оно вернёт nil и цикл прервётся
return n
end
end
Каждый раз в цикле for v in traverse(list) do ... end будет вызываться лямбда, она будет переключать элемент на следующий и возвращать его в v. В общем-то всё.
Snusmumriken
А теперь вот тебе упражнение: написать итератор, который возвращает элементы в списке в порядке добавления : )
Он довольно сильно отличается.
Anonymous
Anonymous
Снус, а чем твой пример концептуально отличается от примера из книжки ? В примере из книжки фабрика кроме итератора возвращает инвариантное состояние и начальный индекс, а у тебя только итератор. Я снова запутался. Итератор из книжки реализован без состояния (хранит свое состояние в переменных цикла for), а твой итератор хранит состояние внутри себя ?
Anonymous
У тебя вариант с замыканием ? Под лямдой ты имеешь ввиду замыкание ?
Anonymous
Как меня достала эта поездатая связь в поезде...