Ликбез по Lua

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 14411
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 83 times
Been thanked: 484 times
Contact:

Ликбез по Lua

Post by John Doe »

В данной теме задаём вопросы по Lua.

Для того, чтобы получить начальное представление о языке достаточно почитать какую-нибудь короткую обзорную статью, например:
Для более близкого знакомства рекомендую эти документы:
Ultrabyte
Posts: 183
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 17 times
Been thanked: 18 times

Ликбез по Lua

Post by Ultrabyte »

Latest post of the previous page:

Code: Select all

Console=100
local function Get(Name)
    return _G[Name]
end
far.Text(0,0,0x0E,Get("Console"))
Почему-то возвращается nil, хотя chatGPT утверждает, что должно 100. Как решить?

Или проще, как получить из

Code: Select all

_G["Console"]
получить 100 ?
Shmuel
Posts: 7108
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 47 times
Been thanked: 605 times

Ликбез по Lua

Post by Shmuel »

Ultrabyte, откройте macroapi_manual.ru.chm и прочитайте статью Разное/Переменные.
Если после этого вопросы останутся, буду готов ответить.
Last edited by Shmuel on Sat 27 Sep, 2025 05:06, edited 1 time in total.
Ultrabyte
Posts: 183
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 17 times
Been thanked: 18 times

Ликбез по Lua

Post by Ultrabyte »

Прочитал, вроде _G относятся не к моей теме (глобальные переменные ВСЕХ скриптов..блаблабла). Видимо не в ту степь залез.
Как тогда по другому решать задачу, где вхождение стринг и на выходе значения переменной в стринге?

Чатгпт всё равно сует свой _G...
Last edited by Ultrabyte on Sat 27 Sep, 2025 05:17, edited 1 time in total.
Shmuel
Posts: 7108
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 47 times
Been thanked: 605 times

Ликбез по Lua

Post by Shmuel »

Ultrabyte wrote: Sat 27 Sep, 2025 05:14 Как тогда по другому решать задачу, где вхождение стринг и на выходе значения переменной в стринге?
Честно говоря, непонятно, в чём состоит задача.
Но возвращаюясь к вашему исходному сообщению, если вместо Console=100 вы напишете _G.Console=100, то ваша функция Get будет работать.
Ultrabyte
Posts: 183
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 17 times
Been thanked: 18 times

Ликбез по Lua

Post by Ultrabyte »

Да, так работает, спасибо!. ЧатуГПТ поставлю двойку...

Однако, сомнительное "улучшения". Таких переменных под сотни, и каждому присваивать префикс _G. ? :(
Возможно, есть другие варианты перевода стринга в название переменных?

Shmuel
Posts: 7108
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 47 times
Been thanked: 605 times

Ликбез по Lua

Post by Shmuel »

Всё зависит от того, насколько живуче должно быть данное хранилище данных.
Должно ли оно сбрасываться при перезагрузке макросов?
Должно ли оно сохранять значения при перезапуске Фара?
Ultrabyte
Posts: 183
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 17 times
Been thanked: 18 times

Ликбез по Lua

Post by Ultrabyte »



как пример типичный бесполезное раздутие кода:

Code: Select all

  local qw =F.FST_QWORD
  local st =F.FST_STRING
  local s =far.CreateSettings()
  local sk=s:CreateSubkey(F.FSSF_ROOT,configguid,'ViewColor')
  s:Set(sk,'AutoScanRun',qw,AutoScanRun	and 1 or 0)
  s:Set(sk,'NameColorDefault',st,NameColorDefault)

  и т.д. (допустим 20-50 штук)
упоминается два раза AutoScanRun (стринг и переменную). Как сократить?
Shmuel
Posts: 7108
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 47 times
Been thanked: 605 times

Ликбез по Lua

Post by Shmuel »

Ultrabyte wrote: Sat 27 Sep, 2025 05:47 Эти вопросы второстепенные (сейчас вроде работает и пофик).
Если будете называть мои вопросы-уточнения второстепенными, то нам не о чем говорить.
Ultrabyte wrote: Sat 27 Sep, 2025 05:47 Достиг потолка 260кб.
Вас не смущает, что ни у кого никогда не существовало этой проблемы?
Ultrabyte wrote: Sat 27 Sep, 2025 05:47 Как сократить?
Храните данные в таблице или таблицах. Пользуйтесь функциями mf.mload, mf.msave.
Ultrabyte
Posts: 183
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 17 times
Been thanked: 18 times

Ликбез по Lua

Post by Ultrabyte »

Ну я так понял ответ: нет, нельзя перевести стринги в переменную.
Спасибо.
Shmuel
Posts: 7108
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 47 times
Been thanked: 605 times

Ликбез по Lua

Post by Shmuel »

Ultrabyte wrote: Sat 27 Sep, 2025 05:58 Ну я так понял ответ: нет, нельзя перевести стринги в переменную.
Пользуйтесь таблицами, там это "перевод" предусмотрен. Например:

Code: Select all

local Cfg = {
  Color = 0xF0;
  X = 7;
  Y = 9;
}
Для получения или изменения параметра используются именно стринги, например:

Code: Select all

local defcolor = Cfg.Color -- эквивалентно Cfg["Color"]
-- или
Cfg.Color = 0xA5 -- эквивалентно Cfg["Color"] = 0xA5
Ultrabyte
Posts: 183
Joined: Sun 26 Mar, 2023 17:59
Has thanked: 17 times
Been thanked: 18 times

Ликбез по Lua

Post by Ultrabyte »

Спасибо. Да, придется заворачивать в таблицу.
Год назад пытался заворачивать в стиле Cfg["Color"], не помню, что там случилось, то-ли не читабельный код или LUA стал медленнее. Может стоит попробовать в стиле Cfg.Color..
Я подумаю...
User avatar
buniak_a_h
Posts: 4546
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 672 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

Ultrabyte wrote: Sat 27 Sep, 2025 05:00 Или проще, как получить из
_G["Console"]
получить 100 ?
У Вас нету _G["Console"].
Попробуйте в первой строке написать _G.Console=100.
Last edited by buniak_a_h on Mon 29 Sep, 2025 03:42, edited 1 time in total.
Post Reply

Return to “Нужна помощь”