Как стать автором
Обновить

Комментарии 20

Спасибо, интересная статья!
Спасибо за оценку! Статья стала квинтэссенцией защитных механизмов против шишек набитых мной в Lua за 5 лет, в Corona SDK за 3 года.

Вы не могли бы развить тему по поводу thread? Когда я имел дело с Lua — coroutine/thread были моделью stackful "продолжений". При resume происходило переключение стека и выполнение участка кода до следующего yield или завершения. Но никакого планировщика не было и в помине. Т.е. выглядело как непрозрачный вызов функции. Если же Corona SDK добавляет планировщик — неясно, как происходит ожидание асинхронного результата.

Насколько я понимаю в Corona SDK нет ничего нового для корутин и resume блокирует основной поток (и отрисовку экрана). Соответственно приложение будет зависать на время выполнения resume. (Небольшой пример)
При использовании есть один существенный минус, если в коде перенесенном в нить возникнет ошибка вы об этом не узнаете

Resume возвращает boolean флаг указывающий произошла ли ошибка. Если флаг установлен в false то вторым возвращаемым значением будет сообщение с деталями ошибки.
Не могли бы вы пояснить пример с coroutine.create?

Согласно документации network.request уже является асинхронной функцией и смысла выносить её в отдельный поток я не вижу.
В действительности запросы network.request завешивают приложение и пример я приводил именно из личного опыта. По замыслу творцов Corona SDK таймер то же должен выполняться в отдельном контексте но вы можете сами провести эксперимент, разместите этот замечательный код где-нибудь в main, соберите приложение и попробуйте им пользоваться:
timer.performWithDelay(100, function()
network.request( урл ресурса с плохим пингом )
end)

Так же можно попробовать грузить файл на сервер по таймеру каждый тик таймера будет завешивать приложение. Мне короутины помогли. А вообще в примере нужно было просто привести пример объекта типа thread…

Возможно вы путаете network.request с библиотекой socket входящей в состав Corona? Код с использованием этой библиотеки выполняет синхронный (блокирующий) запрос:
local http = require( "socket.http" )
http.request{ ... }

Единственная моя претензия: текущий пример thread не показывает преимущество корутины (если вы не используете coroutine.yield то весь код функции всё-равно выполнится за один раз и заблокирует обновление экрана до конца выполнения).
боюсь вы правы в обоих случаях… чуть позже доработаю статью. спасибо…
да я проверил в том случае где была проблема я действительно использовал http.request на тот момент опыт был совсем никакой и использовал первое что попалось под руку… http.request действительно лагает и короутины решают с ним вопрос.

100501-я статья "lua-для-самых-маленьких". А где про корону-то?

На русском статей чуть меньше. В статье делается акцент на особенности применения Lua именно в короне. Да для совсем маленьких, но я нахожу такой вариант более приемлемым чем сразу начинать с 100 страницы. На мой взгляд корона в русскоязычном сообществе редкий гость, чего стоят группы в ВК с 500 подписчиками, т.е. писать статьи для «совсем больших» несколько преждевременно.
Самое то, что надо, чтобы не совершать неочевидных ошибок на первом этапе освоения нового движка. Так-то Lua красивый и мощный, но реализации стека в разных движках имеют особенности. И прошлый опыт может внезапно подкузьмить.
Корона — это просто частный вариант реализации Lua. И как бы далеко не ушел в самом SDK, однажды упираешься в то, что без знания матчасти — никуда. А данная статья — как раз об этой самой матчасти. Просто и понятно.
exe_com К слову, функция string.lower(s) (как и преобразование вверх) не работает с кириллицей. Для преобразования регистра в строке нужно предварительно использовать плагин utf8.
Спасибо за статью :)
Да вы правы, но эти тонкости я думал обсудить уже в разрезе изучения Corona SDK. Добавил пояснение. Спасибо.
Спасибо :) Этим вы выгодно отличите свою доку от великого множества остальных. Где функция уверенно приведена и якобы работает в полный рост, а за решением — все равно приходится идти на официальный форум, где люди работают преимущественно с латиницей и с такой проблемой никогда не сталкивались. У них итак все хорошо.
я в свое время решал проблемы с utf всякими самобытными костылями вроде этого:
utflen = function(ustring)
	local i = 0
	for uchar in string.gfind(ustring, "([%z\1-\127\194-\244][\128-\191]*)") do
		i = i + 1
	end
	return i
end
Да уж. Плагину utf8 всего-то годик-полтора, как помнится.
Как-то смутно описано удаление содержимого таблиц и ключей таблиц: «Это неправильно! Вот так правильно! Это хороший способ. А этот плохой.» Роберто в своей «Programming in Lua» утверждает что все способы хорошие, только по разному применимые. Или Вы описываете относительно Corona SDK? Тогда имеет смысл акцентировать на этом.
Статья рассчитана для новичков. Lua замечательный язык, но исходя из своего опыта мне кажется что не все одинаково допустимо. Я делаю советы типа «плохо / хорошо» и надеюсь что это поможет реже допускать сложные логические ошибки. Касаемо автора книги и языка, я ни в коем случае не оспариваю его авторитет, но нередко творение великих начинает жить своей жизнью сразу после первого выхода в свет и становится не ясно так ли действительно хотел творец. Взять к примеру не простую судьбу оператора goto который из версии в версию мигрирует в угоду просьбам пользователей и почти всегда является злом, пожалуй, кроме случая выхода из вложенного цикла.
Ну, раз уж нет continue, то и goto сгодится. Главное помнить, что он работает только под luajit и lua v. 5.2 и выше. А на 5.1 не работает. Я пробовал goto, мне понравилось, если честно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории