Можно ли получить имя переменной, имея саму переменную?

Страницы: 1
RSS
Можно ли получить имя переменной, имея саму переменную?
 
Здравствуйте!

Подскажите пожалуйста, можно ли имея переменную, поцедуре (например которая выводит значение этой переменной) получить каким-нибудь образом имя этой переменной?

Хочется сделать функцию, которая выводила бы переменную с ее именем:

Например

function print_perem (perem)
    name_perem = ????????
    message (name_perem .."="..tostring(perem))
end

A=2
print_perem (A)

Вот вопрос, как можно name_perem  получить?

Заранее спасибо!  
 
Цитата
Sergey Denegin написал:
A=2
print_perem (A)
имя переменной "A" значение 2
Обратиться к переменной по имени так:
A=2
print(A)
print(_G["A"])
 
Как вывести значение переменной, это понятно.
Мне нужно вывести ИМЯ ПЕРЕМЕННОЙ.
Причем не конкретной переменной, это понятно как, а той, которая например в качестве параметра была передана внутрь функции
 
Цитата
Sergey Denegin написал:
Как вывести значение переменной, это понятно.
Мне нужно вывести ИМЯ ПЕРЕМЕННОЙ.
Причем не конкретной переменной, это понятно как, а той, которая например в качестве параметра была передана внутрь функции
http://www.lua.org/manual/5.2/manual.html#pdf-table.unpack
4.9 – The Debug Interface
 
Здравствуйте,
Пока видится только вариант с передачей имени переменной в функцию
Код
function print_perem (perem,name_perem)
  message (name_perem .."="..tostring(perem))
end
A=2
print_perem (A,"A")


уточните подробней для чего Вам это? какая задача решается?
 
задача универсальности функций. Один из самых простых примеров, для отладки часто нужно вывести значение переменной. Чтобы не писать каждый раз
message("a="..tostring(a))

хочется сделать универсальную функцию:
vivod(a)
чтобы она выводила и название переменной, и ее значение

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

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

Буду благодарен за помощь, потому что ссылка на 4.9 – The Debug Interface  как-то очень уж замудреная
 
Sergey Denegin,

узнать имя передаваемой в функцию переменной нельзя.
Но можно передать имя в качестве параметра функции (как в примере выше)
debug позволяет узнать имя переменной, но ее вызов внутри функции вернет имя параметра функции а не имя переменной
то есть в Вашем примере будет "perem=2" а не "A=2" как хотелось бы
Поэтому других вариантов нет. Только передавать имя в качестве параметра
 
Понял, очень жаль ((( спасибо большое за консультацию!
 
Добрый день.
Можете привести пример языка в котором Ваши задачи решаются? Возможно есть обходные пути.
 
Увы, я почти не программировал на объектно ориентированных языках, поэтому такого не встречал нигде, но и не встречал чего-то подобного, как _G, поэтому решил поинтересоваться, может есть что-то подобное.
В том же VBA ведь есть свойства объектов, где через точку можно получить и цвет, и содержание ячейки.
Думал вдруг у переменной есть что-то типа  А.имя, которое будет возвращать имя переменной

Пока единственный способ сделать то, что мне нужно, это передавать в дочернюю процедуру не сам параметр, а его имя

например:

vivod("a")

а уже внутри нее получать значение через _G

Кстати тогда сразу вопрос - _G дает получить значение только глобальных переменных.
А можно ли получить доступ подобным образом, если переменная описана локально в этой процедуре?

 
 
Цитата
Sergey Denegin написал:
А можно ли получить доступ подобным образом, если переменная описана локально в этой процедуре?

попробуйте так:

Код
function test(perem)
i=1
repeat
   n,v = debug.getlocal(1, i)
   message(n.."="..v)
   i=i+1
until n==nil
end
test("A") 
 
поправка
Код
function test(perem)
local qwe=123
i=1
repeat
   n,v = debug.getlocal(1, i)
   if n~=nil then
      message(n.."="..v)
   end
   i=i+1
until n==nil
end


test("A") 
 
Можно сделать все или почти все.
Результат зависит от знания предмета.
Поэтому начинать надо с изучения языка, а не придумывания задач для незнаек.
 
Николай, вы изучили язык? можете что-то дельное посоветовать, кроме общих слов?  
 
Добрый день.
Задача в общем случае не решаема. Вот простой пример:
Код
function find_var(value)
   for k, v in pairs(_G) do
      if v == value then 
         print('for ' .. value .. ' found ' .. k)
      end
   end
end

x='qwerty'
find_var('qwerty')
print '-------'
y=x
find_var('qwerty')
--[[
output:
for qwerty found x
-------
for qwerty found y
for qwerty found x
--]]

Реально в памяти будет лежать одна копия строки 'qwerty', но ссылка на нее в двух разных переменных. Аналогично с таблицами и функциями.
Однозначно по значению нельзя найти имя переменной.
 
Понял Вас, спасибо большое! перебирать все переменные это конечно не вариант )  
Страницы: 1
Читают тему
Наверх