Для более близкого знакомства рекомендую эти документы:
Programming in Lua, автор — Roberto Ierusalimschy, один из создателей языка.
Рекомендуется второе издание (на сайте бесплатно выложено первое, частично есть и русский перевод: web, chm).
Справочное руководство по языку Lua 5.1: manual (на русском: web, chm).
IgorZ wrote: А вот с __len, __ipairs, __pairs что-то, кажется, не так.
Перечисленные метаметоды не работают для таблиц в Lua 5.1, в чём легко убедиться из мануала. Последние два вообще отсутствуют в Lua 5.1.
Если скомпилировать LuaJIT с ключом -DLUAJIT_ENABLE_LUA52COMPAT, тогда эти метаметоды должны работать.
Когда с этими особенностями сталкиваешься каждый день, то перестаёшь видеть что-то особенное
Ликбез по Lua
Posted: Fri 30 Dec, 2016 05:34
by IgorZ
Shmuel wrote:
IgorZ wrote: А вот с __len, __ipairs, __pairs что-то, кажется, не так.
Перечисленные метаметоды не работают для таблиц в Lua 5.1, в чём легко убедиться из мануала.
Читал мануал по версии 5.1 на lua.org. __tostring там тоже отсутствует, однако, работает при этом. Так что до окончательного прояснения вопроса было (мной) решено ориентироваться на перечисленные в коде библиотеки имена.
Shmuel wrote:Последние два вообще отсутствуют в Lua 5.1.
А вот понадобились. Как раз эти три (ну и кое-что ещё неплохо бы, но эти важнее).
Shmuel wrote:Если скомпилировать LuaJIT с ключом -DLUAJIT_ENABLE_LUA52COMPAT, тогда эти метаметоды должны работать.
Может, сделать это для Far?
Ликбез по Lua
Posted: Fri 30 Dec, 2016 08:19
by Shmuel
IgorZ wrote: Читал мануал по версии 5.1 на lua.org. __tostring там тоже отсутствует
"len": the # operation.
function len_event (op)
if type(op) == "string" then
return strlen(op) -- primitive string length
elseif type(op) == "table" then
return #op -- primitive table length
else
local h = metatable(op).__len
if h then
-- call the handler with the operand
return (h(op))
else -- no handler available: default behavior
error(···)
end
end
end
видно, что для таблиц он должен работать, но не работает. tostring, как нетрудно заметить, в списке отсутствует.
Ну допустим в этом разделе __tostring не указан, что мешает сделать поиск его на всей странице? Разве ваш браузер не имеет функции поиска в загруженной странице?
IgorZ wrote: Как видно, len есть, из примера к нему видно, что для таблиц он должен работать, но не работает.
Из примера как раз видно, что для таблиц он не должен работать, там даже прокомментировано, что возвращается "primitive table length".
Ну допустим в этом разделе __tostring не указан, что мешает сделать поиск его на всей странице? Разве ваш браузер не имеет функции поиска в загруженной странице?
Сделал. Был откровенно (и неприятно) удивлён результатом. В моём понимании, там, где в руководстве перечисляются метаметоды, они должны быть перечислены все. Так что даже и подумать не мог, что в официальной документации всё так странно.
Shmuel wrote:
IgorZ wrote: Как видно, len есть, из примера к нему видно, что для таблиц он должен работать, но не работает.
Из примера как раз видно, что для таблиц он не должен работать, там даже прокомментировано, что возвращается "primitive table length".
Тут даже не знаю, что сказать. Почему-то всегда воспринимал это как пример использования метаметода. И только сейчас вдруг дошло, что это следует рассматривать как текст метода по-умолчанию. Здесь мой косяк, однозначно. Жаль, пропадает очень интересная задумка.
Ликбез по Lua
Posted: Thu 19 Jan, 2017 10:16
by John Doe
IgorZ wrote: Жаль, пропадает очень интересная задумка.
В 5.2 работает и для таблиц.
В 5.1 тоже наверно можно извратиться используя в качестве объектов userdata (newproxy)
Ликбез по Lua
Posted: Thu 19 Jan, 2017 10:23
by IgorZ
John Doe wrote:В 5.1 тоже наверно можно извратиться используя в качестве объектов userdata (newproxy)
Спасибо за совет. Может, попробую.
Ликбез по Lua
Posted: Thu 19 Jan, 2017 10:28
by John Doe
IgorZ wrote: В моём понимании, там, где в руководстве перечисляются метаметоды, они должны быть перечислены все.
Because metatables are regular tables, they can contain arbitrary fields, not only the event names defined above. Some functions in the standard library (e.g., tostring) use other fields in metatables for their own purposes.
Это дописали в 5.3.
Аналогично и с __gc
Ликбез по Lua
Posted: Fri 23 Jun, 2017 19:22
by Dennis_Moore
Не пойму в чем отличие между \n и \r - и то и другое переводит строку. Или отличий нет только под Windows ? Мне казалось что \r вернет в начало текущей строки.
Ликбез по Lua
Posted: Fri 23 Jun, 2017 19:30
by HaRT
Dennis_Moore wrote: ↑Fri 23 Jun, 2017 19:22в чем отличие между \n и \r
Lua тут ни при чём. Почитайте в Википедии про CR и LF.
Ликбез по Lua
Posted: Sat 09 Sep, 2017 22:06
by buniak_a_h
Уважаемы знатоки!
Извините, если вопросы покажутся вам глупыми. Быстро ответов не нашёл, решил спрсить напрямую - вам же не много времени потребуется чтоб ответить.
1. Есть ли в lua директивы компиляции? Конкретно интересуют аналоги #define, #ifdef и #include. Что в fml есть - я нашёл, но пока не понял, как эти библиотеки использовать. Да и ссылка на пример использования в форуме - "висячая".
2. Если нет #include, то как можно подключать однажды написанную функцию(чтобы не копипастить)? Видел, вроде, нечто в папке modules, но терминология для меня совершенно незнакомая; попробовал вызывать таким образом функции из tableview.lua (авторов Maxim Gonchar и Shmuel Zeigerman) - для просмотра локальных таблиц. Делал, вроде по аналогии, но не вызвались.
--
Вы только напишите. Если через modules, буду дальше рыть require...
local cmdl={
--[[good=]][[7z.exe e -so "H:\Program Files\Far Manager\Encyclopedia\FarEncyclopedia.ru.chm" *.hhk]],
--[[bad =]][["7z.exe" e -so "H:\Program Files\Far Manager\Encyclopedia\FarEncyclopedia.ru.chm" *.hhk]] }
local choice=far.Message('Какой вариант пробовать будем?', nil, 'Без кавычек;С кавычками')
if choice>0 then
local ff = io.popen(cmdl[choice])
if ff then
ff:seek('set',0)
local iLine=0
for _ in ff:lines() do
iLine = iLine + 1
end
ff:close()
far.Show('iLine='..iLine)
end
end
В приведённом скрипте первая строка отличается от второй только наличием кавычек вокруг имени программы. Обе эти командные строки, будучи записанными в bat-файл (или введёнными в командной строке) действуют одинаково. Но при выполнении из этого скрипта первая строка работает нормально, а вторая приводит к сообщению "Синтаксическая ошибка в имени файла, имени папки или метке тома." . Это не было бы проблемой, если бы не возникло необходимости запускать программу с указанием полного пути, включающего (увы!) C:\Program files. А для указания пробела надо как-то включать кавычки... Да и вообще - как-то странно...