Александр
а возвращает то nil то результат вида function: 0xfae4a0
Александр
хотя если вставить в цикл for или while то всё ок
Александр
надо как то явно указать тип возвращаемого значения?
Highly Likely
а возвращает то nil то результат вида function: 0xfae4a0
Потому что gmatch – возвращает итератор
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
желательно сразу в 2 переменные. без всяких for итп
Здорово. Прочитай то что написано на моих скринах
Highly Likely
Чем, по-твоему, отличаются string.match и string.gmatch?
Александр
ну судя по скрину мне вообще string.format нужен
Александр
чем отличается не знаю , я последний раз lua лет 7 нааад щупал и то немного
Highly Likely
:/
Александр
спасибо все ок
Highly Likely
спасибо все ок
Любопытства ради – тебе > 40?
Александр
близко к тому. но я человек , замученный нарзаном
Александр
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
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
Я прост не очень понимаю, зачем четвёртое, и зачем на русском : ) Мне в своё время хватило 5.1 для всего, плюс прочитать все отличия 5.3 в онлайн-доке. С учётом того что я с английским сильно на "вы", там фактически симпл-инглиш. А переводы страдают отсебятиной и всякой такой ерундой.
Все верно , в книге симпл инглиш, но как бы небыло кошерно читать книгу на английском - скорость чтения и усваивания материала на русском несравнимо выше, тем более когда под рукой нет встраиваемого переводчика (я еду в поезде). А вот референс (официальный справочник по языку) сам бог велел читать на английском, там сухие технические термины без литературных рассуждений
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 Или просто на пустую строку проверка.
Snusmumriken
Кажется просветление уже близко (смутило , что в ключе с именем next ссылка не на следующий , а на предыдущий "узел". Пытаюсь в этом недоинтерпретаторе ( qlua) скомпилить пример, но не могу понять какой управляющий символ скормить консоли, чтобы она поняла , что поток ввода для io.lines окончен
Next — традиционное имя ссылки на "следующий элемент цепи". С другой стороны, эта фигня может работать как стек! Изъятие и удаление последнего элемента — last_item, list = list, list.next (просто потому что сам list в последней итерации и есть ссылка на последний элемент, а мы перезаписываем его предпоследним)
Anonymous
Ты типа такой: if line == 'stop' then break end Или просто на пустую строку проверка.
Получилось. Только для обхода исп пример с итератором из книжки
Anonymous
/help@FailsBot
Snusmumriken
Привет @dasertuoi, расскажи немного о себе.
Anonymous
Это я пытаюсь найти каким тегом обернуть код, для читаемости
Anonymous
Чтобы не pastebin-нить
Snusmumriken
Привет
Зачем прибыл? У тебя какие-то вопросы по Lua? : )
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
Снус, а чем твой пример концептуально отличается от примера из книжки ? В примере из книжки фабрика кроме итератора возвращает инвариантное состояние и начальный индекс, а у тебя только итератор. Я снова запутался. Итератор из книжки реализован без состояния (хранит свое состояние в переменных цикла for), а твой итератор хранит состояние внутри себя ?
Anonymous
У тебя вариант с замыканием ? Под лямдой ты имеешь ввиду замыкание ?
Anonymous
Как меня достала эта поездатая связь в поезде...