2013-10-15 4 views
0

Как новичок в Lua, извините, если ответ на это прост. Я пытался вызвать функцию внутри кода, но после двух часов поиска я не смог найти нужные результаты. (Может быть, я использую неправильный поисковый запрос-х?)Вызов имени функции

Пример кода

function Test123()  
    SayTest = True 
    if SayTest = True then 
     -- This Is where I want to call the function name Test123, 
     -- yet I can't seem to succeed in this since it is just 
     -- starting a new function 
     SystemNotice (role, function) 
    end 
end 

Это должно быть результатом:

function Test123()  
    SayTest = True 
    if SayTest = True then   
     SystemNotice (role, 'Test123') 
    end 
end 

Если кто-то может помочь мне, я был бы благодарен. Если я все еще неясен, просто скажите мне, и я постараюсь описать это лучше. Мои извинения за мой ограниченный английский.

+3

Непонятно, чего вы пытаетесь достичь. Попробуйте описать простыми словами, что должен делать ваш код. Выведенный фрагмент слишком ограничен и, кроме того, имеет ряд синтаксических проблем, как уже указывал @solarbear. Какие ошибки вы получаете? –

+2

@ user2884099 Lua использует ключевые слова 'true' и' false' для букв bool - обратите внимание на случай. – greatwolf

+0

@LorenzoDonati - Кажется, что OP хочет получить имя текущей функции в реальном времени (''Test123'' в этом случае). –

ответ

0

В вашей декларации функции отсутствует end.

function Test123() 
end 

Прочтите раздел функций от the Lua manual. Только для записи, ваш if также понадобится end.

2

В функциях Lua на самом деле значения. Это означает, что у них действительно нет имени, вы можете назначить их только для поля переменной или таблицы, но поскольку само значение не имеет понятия о его имени, вы не можете его получить.

Тем не менее, с debug библиотеки, вы можете сделать это:

function getfname() 
    return debug.traceback("", 2):match("in function '(.-)'"); 
end 
function bar() 
    print(getfname()) 
end 

bar();    -- prints bar 
foo = bar; 
foo()    -- prints foo 
knerf = {rab = bar}; 
knerf.rab()  -- prints rab 

Обратите внимание, что это работает только с Lua обработчиком ошибок или тот, который возвращает тот же или очень похожий вывод по умолчанию, однако вы можете очевидно изменить шаблон в соответствии с тем, что вам нужно.

Прочтите это: Я бы не рекомендовал это решение для высокопроизводительных задач. Оба соответствия строк и трассировка не подходят для этого. Кроме того, очевидно, что библиотека отладки должна быть включена, поэтому вы можете фактически использовать функцию трассировки.

0

Это конструкция, которая просто противоречит философии Lua, которая функционирует как граждане первого класса: Функция - это еще одно значение, и поэтому у него нет имени.

Переменной может быть присвоено значение, что связывает функцию с именем. Но это имя может измениться. или функция может иметь несколько имен. Какой из них выбрать?

Лучшее решения было бы создание анонимной функции с повышать стоимость (укупорочной) вместо:

function genTest(name) 
    return function()  
     SayTest = true 
     if SayTest == true then   
      print ('role', name) 
     end 
    end 
end 

Test123 = genTest('Test123') 
Test123() 
foobar = Test123 
foobar() 

Это создает функцию с связанными местными именами переменными (см PiL 6.1).

Смежные вопросы