Перейти к содержимому

Лидеры


Популярный контент

Показан контент с высокой репутацией 28.01.2019 во всех областях

  1. 2 балла
    Показывает основную информацию о системе и дисках, позволяет выбирать приоритетный и конкретные диски для загрузки. Из работающего: Информация о системе Краткая информация о дисках Загрузка через init.lua в корне диска Установка приоритетного загрузочного диска (при старте биос будет пытаться загрузится именно с него, а потом уже проверять другие диски) Выжигающий глаза интерфейс и код Форматирование дисков Загрузка в MineOS Из не работающего: Загрузка в Plan9k и SecureOS Вкладка настроек Частично работающее: Загрузка в MineOS (не будет работать если установлено значение приоритетного диска) Предстоит реализовать: Вкладку настроек с языком Включение/выключение авторана Функцию ремонта файла запуска системы (перекачка с репозиции) Модификатор запускаторов MineOS и OpenLoader Запуск файлов на уровне биоса Поддержку (хоть какую нибудь) дисков в блочном режиме Вырезать главный кусочек и сделать возможность работы без интернет карты Перелопатить интерфейс и код, дабы делать всё через ООП Для установки прошейте биос этим файлом: https://raw.githubusercontent.com/titan123023/OCBios/master/bios-starter.lua Сслыль на репозицию: https://github.com/titan123023/OCBios Для работы требуется: Интернет карта Монитор любого уровня Клавиатура (если хотите зайти в сам биос) Как минимум 1 палец (см описание выше)
  2. 2 балла
    @Totoro зараза! Ну что ж... вряд ли автор объявится, так что пусть она будет Тоторина, ибо так велит мой бог, нашептывая на ушко. Касаемо оси: кардинально переработана система полноэкранных приложений. При активации режима полного экрана для каждого окна полностью отключается весь интерфейс, за исключением верхней менюхи. Таким образом в полноэкранном режиме приложения пашут с той же скоростью, как если бы они были не зависимы от ОСи. А еще добавлена клевая анимация изменения размеров окон:
  3. 1 балл
    Хочу поделится с вами своей библиотекой, которую использую практически в каждой программе с графическим интерфейсом. С ее помощью можно генерировать любые "окна" на свой вкус, работать с ними, а затем получать результат работы в обычном массиве. Cкачать библиотеку: pastebin get wtWVFpKZ lib/windows.lua Подробное описание основной функции и ее аргументов: Примеры работы с библиотекой:
  4. 1 балл
    В последних версиях OpenComputers обрастает всякими загадочными вещами. Игроки, которые только только освоились с предыдущей версией вдруг понимают, что надо изучать все заново. "А пошло оно все!" - думают игроки, и уходят на версию 1.3.6, или переучиваются на ComputerCraft, который проще, и не требует непонятного. А одна из самых загадочных - неведомый EEPROM. Это такая мелкая хрень, без которой не работает ни один компьютер, или даже робот. Хорошо еще, что есть стандартный EEPROM который называется Lua BIOS. Он легко крафтится и заставляет работать компьютеры как и раньше. Но найдем задачку посложнее, где Lua BIOS не поможет. Попробуем собрать микроконтроллер, который будет управлять входными дверями. 1. План Представим, как оно должно работать. Слева от двери (если входить) - микроконтроллер. Ради понтов, возьмем Микроконтроллер 2-ого уровня и поставим в него беспроводную сетевую плату. Кроме того добавим красную плату, чтобы управлять дверью. 1. Если контроллер принимает сигнал "open" - он открывает дверь. 2. Если примет сигнал "close" - он закрывает дверь. 3. Если примет посторонний сигнал - взрывает динамит. Дабы сокровища не достались хакерам. Для управления задействуем любой комп, у которого тоже будет беспроводная плата (или точка доступа). 2. Крафтим контроллер С этим проблем не возникнет. Потому, что я играю в креативе :P . Открываем NEI и берем нужные детали. В последний слот положим пока пустой EEPROM. Потом поставим на него прошивку, а пока - не важно. Нажимаем кнопку "Старт" и достаем готовый блок. 3. Готовим прошивку Теперь, когда все готово, мы построили сокровищницу и скрафтили контроллер - осталось самое главное. Программирование EEPROM'а отличается от программирования обычной программы. Потому, что обычно, наши программы выполняются в OpenOS, которая заботливо загружает нужные библиотеки, предоставляет всякие удобные фичи и прочее. Тем не менее писать мы будем именно в OpenOS. Запустим компьютер, напишем edit bios и введем следующие строки: red = component.proxy(component.list("redstone")()) while true do red.setOutput(5, 0) computer.pullSignal(1) red.setOutput(5, 15) computer.pullSignal(1) end Дело в том, что большая часть библиотек, которые мы использовали - это библиотеки OpenOS. А значит мы не можем ими пользоваться в BIOS. Однако кое-что нам доступно. Это библиотеки computer и component, и соответственно все установленные в целевом агрегате (микроконтроллер) компоненты. Более чем достаточно для наших задач. Вышеприведенный код делает следующее: * ищет компонент с названием "redstone" и возвращает его прокси * в вечном цикле посылает нулевой редстоун-импульс направо (side = 5), т.е. гасит сигнал * ждет секунду (на самом деле - ожидает эвентов, то есть сигналов) * посылает редстоун сигнал с силой 15 направо * опять ждет секунду Преследуем двоякую цель: во-первых проверить, что EEPROM вообще работает так про него написано на Вики. Кто его знает? А во-вторых: убедиться, что сторона 5 это именно та сторона, где дверь. А не какая-нибудь другая. Нажмем Ctrl+S, чтобы сохраниться и Ctrl+W, чтобы закрыть редактор. Вставим пустой EEPROM (еще один) в слот нашего компьютера, вместо лежащего там Lua BIOS. И напишем в консоль такую команду: flash -q bios MCBios Программа flash предназначена для прошивки чипов. Флаг -q говорит ей, чтобы не задавала лишних вопросов, затем идет имя файла с нашим кодом (bios) и метка, которую программа шлепнет на чип (MCBios). Все. Доставайте. Lua BIOS на место класть не обязательно, ибо этот слот нам еще потребуется. (Но не забудьте его вернуть, если будете перезагружать компьютер) Чтобы заменить пустой EEPROM в контроллере на наш MCBios, надо положить контроллер и MCBios на верстак. При этом пустой чип вылетит, а новый встанет на его место. Поставим контроллер на пол и протестируем. После клика ПКМ на контроллере - замигала правая лампа. Значит все работает как нужно. 4. Теперь - серьезно Извлеките чип с MCBios обратно (так же как и вставляли, только наоборот). Или приготовьте новый пустой чип. Главное - не запутайтесь в них. Пишем клиент для контроллера. У меня он выглядит примерно так: red = component.proxy(component.list("redstone")()) modem = component.proxy(component.list('modem')()) modem.open(27) red.setOutput(5, 0) red.setOutput(2, 0) -- no explosions yet =) while true do name, _, sender, _, _, message = computer.pullSignal(2) if name == 'modem_message' then if message == 'open' then red.setOutput(5, 15) elseif message == 'close' then red.setOutput(5, 0) else -- hacker tries to get in? red.setOutput(2, 15) -- fire in the hole!!! end end end modem.close() Все согласно плану. Прошиваем чип, вставляем в контроллер, а контроллер ставим слева от дверей. Сзади к контроллеру осторожно прилаживаем запал. ПКМ! Теперь открываем новый файл на компьютере: edit send И пишем в него такой код: local com = require('component') local modem = com.modem local args = {...} modem.broadcast(27, args[1]) print("Message '"..args[1].."' sent!") Сохраняем, и закрываем. Это будет программка для тестирования контроллера. 5. Тест! Пишем в консоль send open. Дверь открылась! Пишем send close. Дверь закрылась! Пишем send opeh Упс! Опечатка. О_О
  5. 1 балл
    - Я умею читать чужие мысли! - А я умею читать чужие регулярные выражения! - Ты победил Люди, которые программируют приложения, связанные с обменом по сети rednet или сохранением на диск, часто сталкиваются с необходимостью преобразования массива данных различных типов в строку и последующим его восстановлением. Под массивом я подразумеваю не отдельно взятую таблицу, а несколько переменных, которые нужно упаковать в одну строку. Самый простой но не самый лучший способ решить эту задачу - поместить все необходимые данные в таблицу и воспользоваться функциями serialize, unserialize из библиотеки textutilse. О недостатках такого способа я уже когда-то говорил и сегодня повторяться не буду. А расскажу о том, как эту проблему решаю я. Предположим нам необходимо упаковать в одну строку значения нескольких переменных (x, y, z). Причем строка должна содержать не только значения переменных, но и информацию о том, что это за переменные. Думаю с упаковкой ни у кого больших проблем не возникнет. Сделать это можно, к примеру, так: s='x='..x..' y='..y..' z='..z В результате мы получим строку, которая содержит имена наших переменных и их значения, отделенные от имен знаками равенства. 'x=10 y=11 z=12' Вроде просто. Но как из этой строки извлечь заложенную в нее информацию, а именно имена и значения? Конечно, можно написать большой и сложный алгоритм посимвольного разбора строки. К счастью, вся скучная работа уже сделана за нас и поставленную задачу мы можем выполнить буквально в одно действие. Я говорю о функциях match и gmatch из библиотеки string. Назначение этих функций - поиск шаблона в строке. К примеру, в строке s, которую я привел выше, я хочу найти подстроку 'y=11'. Для этого я вызываю функцию s:match('y=11') которая и вернет мне искомую подстроку, если она там есть. Параметр 'y=11' будем называть шаблоном. Если шаблон в строке не найден, функция вернет nil. Правда здорово?
  6. 1 балл
    По приколу написал прогу с демонстрацией физический свойств, по типу игры Angry Birds Использование: зажать -> тащить -> отпустить левую кнопку мыши Установка: pastebin run m96mrzf9 Код:
  7. 1 балл
  8. 1 балл
    Да, именно. Любители кучу текста осиливать могут и "Войну и мир" перечитать. А на форуме если хочется обсуждения и лайков побольше, то надо к осмысленному, логически корректному и интересному тексту добавить изображений — также осмысленных, корректных в контексте и интересных.
  9. 1 балл
    Нет, как бы робот не двигался медленно математика везде работает и время на передачу сегмента за 3 тика никуда не исчезает, на 100 разведанных блоков программа будет тратить 15 секунд на передачу данных с 3 сообщениями за сегмент данных и 5 секунд при 1 сообщении за сегмент из cmd cmdX cmdY
  10. 1 балл
    @@vlad1vv1 Этой либе сто лет в обед, и использовать ее нет особого смысла ввиду наличия более продвинутых аналогов. Возьми GUI, меньше геморроя будет. Там тебе и примеры, и картиночки, и вообще до мелочей все расписано: https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/GUI.md А для создания вертикального меню из кнопок воспользуйся одним из примеров в доке: local GUI = require("GUI") ------------------------------------------------- local mainContainer = GUI.fullScreenContainer() mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) -- Создаем вертикально ориентированный список local verticalList = mainContainer:addChild(GUI.list(3, 2, 25, 30, 3, 0, 0xE1E1E1, 0x4B4B4B, 0xD2D2D2, 0x4B4B4B, 0x3366CC, 0xFFFFFF, false)) verticalList:addItem("Hello world") verticalList:addItem("This is test").onTouch = function() -- Сделать что-то при нажатии end verticalList:addItem("Beautiful") verticalList:addItem("Like a shit") ------------------------------------------------- mainContainer:drawOnScreen(true) mainContainer:startEventHandling()
  11. 1 балл
    Отличная идея, попробую реализовать) В ближайшее время обновлю пост --------------------- UPD : когда пройдет депресняк, попробую дописать)
  12. 1 балл
    Круто. Я бы пиксель сделал квадратным. А еще за пикселем можно гаснущий след рисовать.
  13. 1 балл
    Ну, здесь не используется, да. Но его можно использовать для того чтобы запилить "вайтлист" или что-нибудь в таком духе. Я решил что это полезный параметр и не стал его скрывать. Мало ли у кого какие идеи появятся.
  14. 1 балл
    Рад что он все еще актуален )
  15. 1 балл
  16. 1 балл
    Можно ли размещать объекты не только вертикально по отношению друг к другу, но и горизонтально в виде строки? Разные типы объектов
  17. 1 балл
    Эта конструкция использует "главный компонент", который выбирает OpenOS при старте, из списка однотипных компонентов доступных компьютеру. Для EEPROM такое не подойдет, потому что там нет OpenOS, да и файловой системы как таковой. Конструкция modem = component.proxy(component.list('modem')()) по сути как раз и производит выбор компонента из списка вместо отсутствующей ОСи.
  18. 1 балл
    Если либа модульная - это означает, что она имеет несколько готовых модулей (компонентов, элементов, пресетов, объектов) и возможность их подключения по желанию. Создание и подключение кастомных модулей никак не подразумевается термином "модуль". Давайте не будем заниматься казуистикой и построчно выискивать причины для критики каждой софтины
  19. 1 балл
    Если она модульная — то мы можем легко загружать и использовать кастомные модули. Где этот функционал, в чем заключается модульность?
  20. 1 балл
    Если либа — модульная, то можно как-то написать свой модуль, наверное?
  21. 1 балл
    Так используй, запрещает кто-то что ли? Можно и в универ, находящийся в 50 метрах от дома, ехать через северо-запад, это уже вопрос личностных привычек и предпочтений. Зачем оффтопить-то? хд
  22. 1 балл
    Преимущества? Минимализм, простой однострочный синтаксис, автоматическое позиционирование, наличие слайдеров/селекторов/свитчей/текстовых полей. И вообще что за глупости, это две совершенно разные библиотеки с различными целями и функционалом, крайне странно их сравнивать. Forms - серьезная либа, предназначенная для создания основы Window-based программ, данная же либа создавалась с целью встраивания в готовый софт, дабы упростить его. А насчет "лишнего кода" - убрал, ибо действительно глаза мозолило.
  23. 1 балл
    Тут стоит ознакомиться с литературой по Луа. Вкратце, операторы языка могут образовывать конструкции, наподобии математических выраженией, с любым уровнем вложенности. "Вычисляются" эти конструкции аналогично, начиная со внутренних скобок. В данной строке, сначала произойдет вызов функции component.list('modem'). Согласно документации ОС, функция component.list() возвращает функцию-итератор по компонентам с подходящими именами. Имя у нас "modem". (Итератор - это такая функция, которая при каждом вызове возвращает следующий элемент коллекции). Далее срабатывают пустые скобки (). На самом деле они стоят там не отдельно. Поскольку конструкция component.list('modem') вернула нам функцию, дописав справа пару скобок, я тем самым вызвал эту функцию. Это можно записать так: <полученная функция итератор>(). Вызванная функция вернула первый элемент коллекции модемов в виде адреса, как и полагается итератору. Таким образом у нас теперь происходит вызов функции component.proxy(<полученный адрес модема>). Как и сказано в документации, результатом становится прокси модема. Вуаля!
  24. 1 балл
    С превеликим удовольствием, но теперь только в 2015-ом)
  25. 1 балл
    =) На сервере IT 1.7.10 можно познакомиться с микроконтроллерами и немного их попинать.
  26. 1 балл
    Zer0Galaxy, изучай OC возможностей в пару десятков раз больше чем в CC.
  27. 1 балл
    Сможет, если собрать полноценный компьютер. Но поскольку для такой небольшой задачи было решено воспользоваться микроконтроллером, Lua BIOS не подойдет. Ведь у микроконтроллера нет файловой системы.
  28. 1 балл
    Хочешь гибкости? Тогда нужно решить по какому событию прерывать алгоритм (и нужно ли вообще). Вот это событие и отлавливать.
  29. 1 балл
  30. 1 балл
    Можно задавать количество повторений в виде числа. Скажем так: local function man(algo) for v,d in string.gmatch(algo, "(%a)(%d*)") do d=tonumber(d) or 1 for i=1,d do if (v == "l") then turtle.turnLeft() elseif (v == "r") then turtle.turnRight() elseif (v == "f") then turtle.forward() elseif (v == "u") then turtle.up() elseif (v == "d") then turtle.down() elseif (v == "b") then turtle.back() elseif (v == "p") then print("lol") else print("Impossible algorithm.") return false end end end return true end Тогда алгоритм будет выглядеть как-то так "f30u15rf10".
  31. 1 балл
    Но лично я в подобных случаях не заморачиваюсь с пустыми захватами, а использую функцию gmatch. Она возвращает функцию-итератор, которая при каждом очередном вызове ищет следующее совпадение шаблона в строке. Функция возвращает функцию! Звучит ужасно, но выглядит всё не так страшно, если применить ее в операторе for in s='x=10 y=11 z=12' -- исходная строка t={} -- таблица, в которой будем хранить результат for key, val in s:gmatch('(%w+)=(%d+)') do t[key]=tonumber(val) -- помещаем результат в таблицу end for key, val in pairs(t) do print(key,'=',val) endОператор for in выполнится столько раз, сколько раз будет найден шаблон '(%w+)=(%d+)' в исходной строке. Причем переменные key и val всякий раз будут принимать очередные захваченные значения - имя и значение переменной.Думаю, теперь мы готовы к тому, что бы написать собственные аналоги функций serialize и unserialize.
  32. 1 балл
    Вернемся к строке s='x=10 y=11 z=12', с которой мы начинали знакомство с шаблонами. Мы видели, что извлечь из нее значения переменных можно так: x,y,z=s:match('x=(%d+)%s*y=(%d+)%s*z=(%d+)')или так: x=s:match('x=(%d+)') y=s:match('y=(%d+)') z=s:match('z=(%d+)')Но как быть, если количество, содержащихся в строке переменных очень большое, скажем, несколько тысяч? Неужели их все придется прописывать вручную? Нельзя ли это как то автоматизировать? Последний пример из предыдущего поста подсказывает, что можно. Мы ведь можем захватывать не только значения, но и имена переменных. А полученные значения размещать в таблице где имя переменной будет именем элемента таблицы. Для простоты будем считать, что имена могут состоять из букв или цифр, а значения только из цифр. Пропишем шаблон для поиска одной переменной и заключим его в цикл для поиска остальных. s='x=10 y=11 z=12' -- исходная строка t={} -- таблица, в которой будем хранить результат for i=1,3 do key, val=s:match('(%w+)=(%d+)') -- извлекаем имя и значение t[key]=tonumber(val) -- помещаем результат в таблицу end for key, val in pairs(t) do -- выводим результат print(key,'=',val) endПриведенный пример кода загружает из исходной строки имена и значения переменной в таблицу t. Однако, если мы попытаемся этот код выполнить, то увидим, что в результате таблица t будет содержать только одно значение x=10. Произошло так потому, что функция match всегда начинает поиск совпадений с начала строки. Всегда, если ей не указать с какого места нужно начинать поиск. Оказывается match имеет еще один необязательный параметр, указывающий с какой позиции строки следует начинать поиск. Его можно узнать вставив в шаблон пустой захват (). Такой захват вернет позицию символа в строке, следующего за найденной подстрокой. s='x=10 y=11 z=12' -- исходная строка t={} -- таблица, в которой будем хранить результат n=1 -- начинаем поиск с начала строки for i=1,3 do key, val, n=s:match('(%w+)=(%d+)()',n) -- извлекаем имя и значение -- пустой захват ставим в конце шаблона, чтобы от вернул позицию символа, следующего за найденной подстрокой t[key]=tonumber(val) -- помещаем результат в таблицу end for key, val in pairs(t) do print(key,'=',val) endПосле внесенных изменений код должен работать более корректно.
  33. 1 балл
    Уточню перечень спецсимволов, используемых в шаблонах . (точка) - заменяет любой символ. %a --- все буквы. %c --- все управляющие символы. (Символы с кодом от 0 до 31, которые не имеют графического представления) %d --- все цифры. %l --- все строчные буквы. %p --- все знаки препинания. %s --- все пробелы (символы с кодом 9, 10, 12, 13, 32). %u --- все заглавные буквы. %w --- все алфавитно-цифровые символы (буквы и цифры). %x --- все шестнадцатеричные цифры (цифры и буквы a-f, A-F). %z --- символ с кодом 0. Использование заглавной буквы в качестве спецсимвола меняет смысл на противоположный. Например %A - все символы кроме букв, %S - все печатные символы Так же хочу добавить еще два спецсимвола ^ и $. Если шаблон начинается с символа ^ или заканчивается символом $, то искаться такой шаблон будет соответственно в начале или в конце исходной строки. Несколько примеров использования шаблонов: '[%+%-]?%d+' - ищет целое число в десятичном формате '0x%x+' - число в шестнадцатеричном формате s= s:match('^%s*(.*)%s*$') - удаляет из строки начальные и конечные пробелы key, val = s:match('([%a_][%w_]*)%s*=%s*(%S+)') - разбирает конструкцию типа key = val, причем имя key должно содержать буквы, цифры или символ подчеркивания и начинаться с буквы или подчеркивания, а val может содержать любые символы кроме пробела.
  34. 1 балл
    На lua вряд ли получится. Match, всё же на джаве писано.
  35. 1 балл
    Шаблоны, которые я рассматривал до сих пор, возвращали строку, требующую дополнительной обработки. В самом деле, если функция match вернула строку 'y=11', то из этой строки необходимо выделить символы, соответствующие значению переменной. Например, вызвать функцию match еще раз. А нельзя ли обойтись одним вызовом? Оказывается можно. Делается это при помощи структуры, называемой захват (capture). Захват оформляется в виде группы символов, заключенных в круглые скобки. Если шаблон содержит захват, то он возвращает не всю совпавшую подстроку, а только захваченное значение, т.е. символы, соответствующие символам захвата. Пример: s:match('y=(%d+)') вернет строку не 'y=11', а '11' Обращаю внимание, match всегда возвращает строку, даже если вы ищите число. Так что от преобразования типа tonumber никуда не деться. Захватов в шаблоне может быть несколько. В этом случае match возвращает столько значений сколько захватов присутствует в шаблоне. Это позволяет искать сразу несколько значений в строке за один раз. Например: s='x=10 y=11 z=12' x,y,z=s:match('x=(%d+)%s*y=(%d+)%s*z=(%d+)') Тут нужно быть внимательным. Во-первых, не забываем про разделители, если они есть (в примере разделителями являются символы пробел - %s). Во-вторых, следует помнить, что шаблон стреляет только тогда, когда совпал целиком. Т.е. если из трех захватов, приведенных в примере, найдены два, а третий не найден, результатом работы функции будет nil и все три переменные x,y,z будут не определены. Поэтому, если вы не уверены, что в исходной строке присутствуют все искомые значения, воспользуйтесь тремя разными поисками. Или же функцией gmatch, о которой я расскажу чуть позже.
  36. 1 балл
    Символы и спецсимволы в шаблоне можно объединять в наборы (сеты). Для этого несколько символов заключаются в квадратные скобки. Набор замещает собой один из символов, входящих в его состав. Например, вот такой набор [%d%p] замещает цифру или знак препинания. А такой [_%w] - букву, цифру или символ подчеркивания. Порядок символов, в котором они идут в наборе значения не имеет. Теперь мы можем найти в строке значение переменной y даже если оно будет отрицательным или сопровождаться знаком + s:match('y=[%+%-]?%d+') Знаки % перед + и - говорят о том, что это не спецсимволы, а обычные + и - Знак ? после набора указывает на то, что + или - могут отсутствовать. А вот такой шаблон s:match('y=[%+%-%d]%d*%.?%d*') позволит найти число в формате с десятичной точкой. Если набор начинается с символа ^ , то такой набор интерпретируется как "всё кроме указанных символов".
  37. 1 балл
    Вы наверняка подумали, а зачем искать в строке значение переменной y, если для поиска нужно знать значение этой переменной? Как быть если значение y заранее не известно? Чаще всего так и происходит. Тогда в шаблон вместо цифр необходимо подставить специальные символы. В нашем случае это %d. s:match('y=%d%d') Спецсимволы в шаблоне заменяют собой другие символы. Спецсимволов припоминаю несколько: %a - заменяют все буквы %d - все цифры %w - буквы и цифры %p - знаки препинания %s - пробел .(точка) - любой символ %. - символ "точка" Спецсимволов чуть больше, но остальные не столь актуальны. Надеюсь, понятно, что функция s:match('y=%d%d') будет искать в строке s подстроку состоящую из символов 'y=' и еще каких то двух цифр. Именно эту подстроку она и вернет. Если найдет. А вдруг мы не знаем из скольки символов состоит значение переменной y. В этом случае на помощь приходят модификаторы. Модификаторы это такие спецсимволы, которые изменяют количество символа за которым стоят в шаблоне. Вот такие я знаю модификаторы: + - соответствует одному или более повторений символа; * - соответствует нулю или более повторений; - - соответствует нулю или более повторений. В отличии от модификатора * возвращает строку минимально возможной длины, но так, что бы она соответствовала шаблону; ? - соответствует нулю или одному символу. Если мы знаем, что значение переменной y состоит из какого то количества цифр (но не менее одной), следует применить модификатор + s:match('y=%d+') Эта функция будет искать в строке s подстроку состоящую из символов 'y=' и какого то количества цифр. Причем вернет подстроку максимально возможной длины, т.е. 'y=' и все цифры следующие за знаком равенства. Продолжение следует ...
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...