Имя переменной Lua - PullRequest
       3

Имя переменной Lua

0 голосов
/ 20 января 2012

У меня есть следующий код в Lua: ABC:

test (X)

Функция тестирования реализована на C ++. Моя проблема заключается в следующем: мне нужно знать, какое имя переменной передается в качестве параметра (в данном случае X). В C ++ есть доступ только к значению этой переменной, но я должен знать ее имя.

Помогите пожалуйста

Ответы [ 3 ]

3 голосов
/ 20 января 2012

Функции не передаются переменным; им передаются значения . Переменные - это просто местоположения, которые хранят значения.

Когда вы говорите X где-то в вашем коде Lua, это означает, что значение можно получить из переменной X (примечание: на самом деле это сложнее, но я не буду вдаваться что здесь).

Поэтому, когда вы говорите test(X), вы говорите: «Получите значение из переменной X и передайте это значение в качестве первого параметра функции test

Похоже, вы хотите изменить содержимое X, верно? Вы хотите, чтобы функция test каким-то образом изменила X. Ну, ты не можешь сделать это прямо в Lua. И вам не следует.

Смотрите, в Lua вы можете возвращать значения из функций. И вы можете вернуть несколько значений. Даже из кода C ++ вы можете вернуть несколько значений. Поэтому все, что вы хотели сохранить в X, можно просто вернуть:

X = test(X)

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

Кроме того, это позволяет пользователю выполнять такие действия, как test(5). Здесь - это без переменных; вы просто передаете значение напрямую. Это одна из причин, почему функции не могут изменить передаваемую «переменную»; потому что не имеет переменной. Передаются только значения, поэтому пользователь может просто передать буквальное значение, а не значение, хранящееся в переменной.

Короче говоря: вы не можете это сделать, и вы не должны этого хотеть.

1 голос
/ 20 января 2012

Правильный ответ: Lua на самом деле не поддерживает это, но есть интерфейс отладки.См. этот вопрос для решения, которое вы ищете.Если вы не можете заставить вызов debug работать напрямую из C ++, оберните вызов функции функцией Lua, которая сначала извлекает результаты отладки, а затем вызывает вашу функцию C ++.

0 голосов
/ 20 января 2012

Если то, что вы ищете, является строковым представлением аргумента, то вы как бы застряли в lua.

Я думаю, что-то вроде в C:

assert( x==y );

Который генерирует приятное сообщение о неудаче.В Си это делается с помощью макросов.Нечто подобное (непроверенное и, вероятно, сломанное).

#define assert(X) if(!(X)) { printf("ASSERION FAILED: %s\n", #X ); abort(); }

Здесь #X означает строковую форму аргументов.В приведенном выше примере это "x == y".Обратите внимание, что это немного отличается от имени переменной - это просто строка, используемая в синтаксическом анализаторе при развертывании макроса.

К сожалению, в lua такой соответствующей функциональности нет.Для моих библиотек тестирования lua я передаю строковую версию как часть выражения, поэтому в lua мой код выглядит примерно так:

assert( x==y, "x==y")

Могут быть способы заставить эту работу работать как assert("x==y"), используякакой-то механизм вычисления и закрытия строк, но мне показалось, что это стоит того, чтобы сделать это со мной.

РЕДАКТИРОВАТЬ:

Хотя это не представляется возможным в чистом lua, естьисправленная версия, которая поддерживает макросы: http://lua -users.org / wiki / LuaMacros .У них даже есть пример более приятного assert.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...