Ликбез по Lua

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

Ликбез по Lua

Post by John Doe »

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

Для того, чтобы получить начальное представление о языке достаточно почитать какую-нибудь короткую обзорную статью, например:
Для более близкого знакомства рекомендую эти документы:
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

LuaMacro — Lua как язык макросов

Post by zg »

Latest post of the previous page:

последний раз. panel.GetSelectedPanelItem(nil,0/1,N+1) возвращает nil. то что вы потом пытаетесь этот nil индексировать и получаете ошибку — это ваши личные половые трудности. и с этим вам точно не сюда.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

LuaMacro — Lua как язык макросов

Post by AleXH »

Всё равно как-то не логично - если я обращаюсь к таблице X и она не существует =nil, то почему в ответ на X.y не ответить nil? Зачем предварительно перед обращением к ней проверять существует ли она? Почему не работать по возвращённому результату? - Таков Lua?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

AleXH wrote: если я обращаюсь к таблице X и она не существует =nil, то почему в ответ на X.y не ответить nil?
Ну и заодно уже, почему бы при вызове несуществующей функции не вернуть nil? Почему бы при выполнении выражения 5+nil не вернуть 5? И т.д. и т.п.

Вообще-то меня уже начали доставать вопросы некоторых, не изучающих документацию. Да ещё и не желающих осмыслить ответы, которые им дают.
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaMacro — Lua как язык макросов

Post by Aidar »

Просто используйте конструкцию

Code: Select all

fn=(panel.GetSelectedPanelItem(nil,0/1,N+1) or {}).FileName
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

LuaMacro — Lua как язык макросов

Post by AleXH »

Shmuel, Если нет желания или настроения, то отвечать однозначно не стоит - вам за это никто не платит, не надо воспринимать это как работу, иначе хобби превратится в тягость, а такого допускать нельзя.
Aidar, кстати да, часто применяю такой метод с переменными. За подсказку спасибо.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

AleXH wrote:Shmuel, Если нет желания или настроения, то отвечать однозначно не стоит - вам за это никто не платит, не надо воспринимать это как работу, иначе хобби превратится в тягость, а такого допускать нельзя.
В подобных советах никак не нуждаюсь, тем более после ваших сегодняшних постов в форуме.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

LuaMacro — Lua как язык макросов

Post by AleXH »

Shmuel, это не совет, не инструкция к действию, это мой взгляд на общение на форуме, так, как вижу его я. Я не требую ответа, не навязываю собственного мнения, я его просто высказываю. если я не хочу отвечать, либо считаю это нецелесообразным, либо нет времени,желания и пр., то просто откладываю на туманное "потом". Это позволяет сохранить позитивное отношение к форуму (любому).
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

Просьба к модераторам: убрать офф-топик (предыдущие 3 поста) в другое место. А данный пост можно удалить.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

LuaMacro — Lua как язык макросов

Post by John Doe »

Aidar wrote:Просто используйте конструкцию

Code: Select all

fn=(panel.GetSelectedPanelItem(nil,0/1,N+1) or {}).FileName
Или как-то так:

Code: Select all

local item = panel.GetSelectedPanelItem(nil,0/1,N+1)
fn = item and item.FileName
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

LuaMacro — Lua как язык макросов

Post by John Doe »

AleXH wrote:Всё равно как-то не логично[...]
почему[...]
Зачем[...]
Почему[...]

- Таков Lua?
Именно.
И обсуждать это на данном форуме не очень осмысленно.
В теме плагина LuaMacro это точно оффтопик.
EGez
Posts: 145
Joined: Thu 04 Oct, 2012 13:53
Location: Hamburg, DE
Has thanked: 2 times
Been thanked: 2 times

Ликбез по Lua

Post by EGez »

AleXH wrote: [ . . . ] если я обращаюсь к таблице X и она не существует =nil, то почему в ответ на X.y не ответить nil? [ . . . ]
Назовите пожалуйста хоть один язык, где такое пройдет без ошибки? Как вы у nil (null/NULL и т.д.) хотите спросить .FileName???

Мне не знаком ни один язык, где такое без ошибки возможно. Почему бы тогда не придумать язык "make all good" и оно само должно за вас все написать? Самому проверить никак нельзя? Что за детский сад?
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Ликбез по Lua

Post by AleXH »

EGez, вы уже второй, кто отвечает вопросом на заданный вопрос.

В свете развернувшейся вчера полемики, ответ RTFM как ни странно, оказался одновременно и самым малоинформативным и самым продуктивным. Из интереса можно посчитать количество написанных в ответ постов, и ни в одном из них нет прямого ответа на вопрос. Это не упрёк, это наблюдение.

А посты с обсуждением, да, надо удалить.
EGez
Posts: 145
Joined: Thu 04 Oct, 2012 13:53
Location: Hamburg, DE
Has thanked: 2 times
Been thanked: 2 times

Ликбез по Lua

Post by EGez »

AleXH wrote: EGez, вы уже второй, кто отвечает вопросом на заданный вопрос.
Каков привет - таков ответ. Какого ответа ожидать, если задать вопрос на подобии "почему земля круглая?"? Попробуйте задать его в кругу своих друзей-сверстников.

Какого ответа вы ожидали на ваш вопрос?:
AleXH wrote:[ . . . ] если я обращаюсь к таблице X и она не существует =nil, то почему в ответ на X.y не ответить nil? [ . . . ]
Раз уж на то пошло, то с этим вопросом вы здесь в любом случае не по адресу, вам сюда: http://www.lua.org/contact.html

Так нормально?
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Ликбез по Lua

Post by AleXH »

EGez wrote: Каков привет - таков ответ. Какого ответа ожидать, если задать вопрос на подобии "почему земля круглая?"? Попробуйте задать его в кругу своих друзей-сверстников.
У вас есть дети? Вы им тоже отвечаете на вопрос "почему земля круглая?" - RTFM? - Если вопрос требует объёмных объяснений, либо предположительно потянет за собой таковые, то отсылку к RTFM хорошо бы сопроводить пояснением этого. Неумение отвечать на "глупые" вопросы говорит о не только о недостатке знаний у вопрошающего, но и об отсутствии соответствующего умения у отвечающего. Если вопрос "не профильный" для ветки в которой он задан, то нужно об этом сказать сразу. Если же причина в том, что в данный момент нет желания/времени отвечать - не отвечай, никто не заставляет.

Обращаясь к сообществу, любой задающий вопрос предполагает услышать ответ, сохраняющий ему время, в противном случае задавать вопросы нет смысла, ведь обратиться к изучению документации при наличии свободного времени можно всегда.
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Ликбез по Lua

Post by ladserg »

AleXH wrote:LuaMacro, в случае отсутствия выделенного файла на панели, при присваивании переменной значения panel.GetSelectedPanelItem(nil,1,1).FileName, выдаёт сообщение attempt to index a nil value - правильно ли это идеологически? Разве не правильно просто возвращать nil?
Чот как кто много оффтопика на пустом месте. nil в данных условиях возвращается, но функцией panel.GetSelectedPanelItem(nil,1,1), и если подходить к ситуации идеологически верно, то (как уже отметил John Doe) идеологически правильно было написать примерно так:

Code: Select all

-- Получим первый выделенный файл
item=panel.GetSelectedPanelItem(nil,1,1)
-- Если оказалось, что ни один файл не выделен,
-- то берёмся за файл под курсором
if item == nil then
	item=panel.GetCurrentPanelItem (nil, 1)
end

-- Получим имя файла
fn=item.FileName
Выдавать исключение при попытке к обращению nil.FileName - это тоже верно, исходит оно ещё из истоков программирования на ассемблере/C/C++, где имя структуры(в lua они зовутся таблицами) представляло собой всего лишь ссылку на адрес в ОЗУ, а имя поля (в данном случае FileName) являлось всего лишь смещение от адреса в байтах. Если адрес структуры указывал в никуда, то и смещение тоже было ошибочным, посему оставлять это без проверки было грубейшей ошибкой, приводившей нередко к плачевным результатам. Вот и появилась такая проверка в языках более высокого уровня.

Советую вам значения функций, возвращающих таблицы, проверять прежде чем обращаться к полям таблицы. Так же заметьте: если функция (в данном случае panel.GetSelectedPanelItem(nil,1,1)) вернула nil, то это всё же что то значит (в данном случае - не выделено ни одного файла), и на это тоже нужно обращать внимание и как то обрабатывать (например если не выделено ни одного файла, то взять файл под курсором).

Как то так.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Ликбез по Lua

Post by John Doe »

AleXH wrote: Обращаясь к сообществу, любой задающий вопрос предполагает услышать ответ, сохраняющий ему время, в противном случае задавать вопросы нет смысла, ведь обратиться к изучению документации при наличии свободного времени можно всегда
Вопрос изначально звучал не как вопрос, а как претензия к LuaMacro, отсюда и реакция отвечающих.
И давайте уже закончим это мусолить, чтобы никого не пришлось банить.

P.S
Относится не только к AleXH.
Post Reply

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