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, то это всё же что то значит (в данном случае - не выделено ни одного файла), и на это тоже нужно обращать внимание и как то обрабатывать (например если не выделено ни одного файла, то взять файл под курсором).
Как то так.