1

Тема: Некоторые нюансы LUA. Прошу подсказать.

Расширяю познания в LUA, а то уже тесновато в рамках известного мне. )
Прошу помочь, кому не лень. )

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

function foo(v)
  [v] = 2 -- здесь иксу присваиваем 2
end

x=1
x=foo("x")

Помнится в каком-то языке я встречал такую возможность, вроде в bat или vbs. А в Lua можно?

2 (2015-11-26 07:51:21 отредактировано swerg)

Re: Некоторые нюансы LUA. Прошу подсказать.

Это называется "передача параметров по ссылке" (а не "по значению").
По ссылке в Lua передаются таблицы. Только таблицы, всегда таблицы.
Не таблицы передать по ссылке в функцию нельзя.

Например:

function Transform(point)
    point.x = point.x / 2
    point.y = point.y * 2
end

p = {
    x = 5,
    y = 6
}

print(p.x, p.y)
Transform(p)
print(p.x, p.y)

При исполнении отобразит:

5    6
2.5    12

Видно, что поля таблицы изменились внутри функции Transform() и изменённые вернулись в основную программу.

3 (2015-11-26 10:10:08 отредактировано GREEN_X5)

Re: Некоторые нюансы LUA. Прошу подсказать.

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

a=function(tab)  
tab.Caption="да"
end

Button1 =    vcl.Button(Form,{Caption="нет", OnClick = function() a(Button1) end})
Button2 =    vcl.Button(Form,{Caption="нет", OnClick = function() a(Button2) end})

А вот в этой части
OnClick = function() a(Button1) end
ссылку на задаваемую переменную Button1 никак не унифицировать, не обобщить? Ни где не хранится на этом этапе, ничем не выдернуть имя переменной? ) Типа вот такого

Button1 =    vcl.Button(Form,{Caption="нет", OnClick = function() a(var_self) end})
Button2 =    vcl.Button(Form,{Caption="нет", OnClick = function() a(var_self) end})

4

Re: Некоторые нюансы LUA. Прошу подсказать.

Не проверял, но должно быть так:

function a(sender)  
sender.Caption="да"
end

Button1 =    vcl.Button(Form,{Caption="нет", OnClick = a})
Button2 =    vcl.Button(Form,{Caption="нет", OnClick = a})

т.е. в обработчик OnClick  и так передаётся параметр - объёкт, по которому клик произведён.

5

Re: Некоторые нюансы LUA. Прошу подсказать.

А ведь действительно, vcl же это делает! Работает, спасибо!

6

Re: Некоторые нюансы LUA. Прошу подсказать.

И по двум функциям пробежаться можно, замечательно.

a = function (sender)  
sender.Caption="да"
end

b = function (sender)  
sender.Top=60
end

Button1 =    vcl.Button(Form,{Caption="нет", OnClick = function(x) a(x) b(x) end})

7 (2015-11-30 00:40:41 отредактировано GREEN_X5)

Re: Некоторые нюансы LUA. Прошу подсказать.

И всё-таки, сформулирую вопрос коротко - возможно получить имя переменной в строчном виде?
Задача например - упаковать в таблицу результаты нажатий кнопок под названиями переменных

Tab={}

function Rec(sender)
  local Name= --получаем имя переменной по ссылке sender в строчном виде
  Tab[Name]=sender.Caption
end

Button1 = vcl.Button(Form,{Caption="да", OnClick =Rec})
Button2 = vcl.Button(Form,{Caption="да", OnClick =Rec})


-- нажимаем обе кнопки и получаем таблицу Tab={Button1="да", Button2="да"}

8

Re: Некоторые нюансы LUA. Прошу подсказать.

GREEN_X5 пишет:
-- нажимаем обе кнопки и получаем таблицу Tab={Button1="да", Button2="да"}

Докопаться какой Lua переменной присвоена "ссылка на объект" - не получится.
Но наверняка вашу задачу можно решить задачу иначе, только надо знать что за задача.

Как минимум можно назначив кнопке явно нужное имя в поле Name, после чего получать это имя из Sender.Name
Оно не обязано совпадать с Lua-переменной, но по нему можно идентифицировать кнопку.

Вы опишите какую задачу планируете решать, отдельным топиком про QVCLua, тогда можно будет подумать над подходящими решениями.

9

Re: Некоторые нюансы LUA. Прошу подсказать.

Тоже потребовалась похожая задача: использовать строку как имя объекта:

S1 = vcl.FloatSpinEdit(M, {Name = 'SU1'})
SU1 = vcl.ComboBox(M, {Items='1\n2', ReadOnly=true})
S2 = vcl.FloatSpinEdit(M, {Name = 'SU2'})
SU2 = vcl.ComboBox(M, {Items='1\n2', ReadOnly=true})
...
vcl.BitBtn(M, {OnClick = function ()
  local con = {S1, S2, ... SN}
  for i = 1, #con do
    local Name = con[i].Name
    if <тут использовать контрол с именем Name, например SU1>.ItemIndex ~= 0 then
      ...
    end
  end  
end

10

Re: Некоторые нюансы LUA. Прошу подсказать.

CyberTrader,

вы сначала прячете всё, потом локальные таблицы (массивы) объявляете, а после пытаетесь с трудом дотянуться до того, что по сути в глобальных переменных S1, S2 и т.д. уже лежит готовое. wink

Предлагаю сразу контролы помещать в таблицу, а потом к ней обращаться. Как-то так примерно:

con = {
    vcl.FloatSpinEdit(M, {Name = 'SU1'}),
    vcl.FloatSpinEdit(M, {Name = 'SU2'})
}

И дальше в любом месте пожалуйста перебирайте массив con, где уже содержатся нужные вам элементы. Ну и не забывайте при OnClick = function (Sender), часто этого достаточно.

11

Re: Некоторые нюансы LUA. Прошу подсказать.

Не в этом дело.