lua - захват переменных назначений - PullRequest
1 голос
/ 05 июля 2010

Ruby обладает этой очень интересной функциональностью, в которой при создании класса с помощью Class.new и назначении его константе (в верхнем регистре) язык «волшебным образом» устанавливает имя класса, чтобы оно соответствовало константе.

# This is ruby code
MyRubyClass = Class.new(SuperClass)
puts MyRubyClass.name # "MyRubyClass"

Кажется, что ruby ​​"захватывает" назначение и вставляет задает имя для анонимного класса.

Я хотел бы знать, есть ли способ сделать что-то подобное в Lua.

Я реализовал свою собственную систему классов, но чтобы она работала, мне нужно дважды указать одно и то же имя:

-- This is Lua code
MyLuaClass = class('MyLuaClass', SuperClass)
print(MyLuaClass.name) -- MyLuaClass

Я бы хотел избавиться от этого 'MyLuaClass' строка.Есть ли способ сделать это в Lua?

Ответы [ 4 ]

4 голосов
/ 06 июля 2010

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

2 голосов
/ 05 июля 2010

Вы можете исключить одно из упоминаний MyLuaClass ...

> function class(name,superclass) _G[name] = {superclass=superclass} end
> class('MyLuaClass',33)
> =MyLuaClass
table: 0x10010b900
> =MyLuaClass.superclass
33
> 
0 голосов
/ 29 апреля 2015

По крайней мере, в отношении Lua 5.2: вы можете захватывать назначения для A) глобальной таблицы состояния Lua, как упоминалось в предыдущем ответе, а также B) для любого другого объекта Lua, чей __indexи __newindex метаметоды были заменены (заменой метатабельного), это я могу подтвердить, поскольку в настоящее время я использую оба эти метода для перехвата и перенаправления назначений, сделанных сценариями Lua, на внешнее управление ресурсами C / C ++.Существует хитрость в том, что касается их чтения, но хитрость в том, чтобы НЕ позволять устанавливать значения в состоянии Lua.Как только они будут там существовать, ваши хуки не будут вызываться, поэтому, если вы хотите пойти по этому пути, вам нужно перехватить ВСЕ попытки получения / установки и НИКОГДА не сохранять значения в состоянии Lua.

0 голосов
/ 06 июля 2010

Не совсем.Lua не является объектно-ориентированным языком.Иногда он может вести себя как один.Но далеко не каждый раз.Классы не являются специальными значениями в Lua.Таблица имеет то значение, которое вы в нее вложили, не более.Лучшее, что вы можете сделать, это вручную установить ключ в _G из функции класса и избавиться от необходимости принимать возвращаемое значение.

Я думаю, что если это ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО беспокоит вас, вы можете использовать debug.traceback ()получить трассировку стека, найти вызывающий файл и проанализировать его, чтобы найти имя переменной.Затем установите это.Но это больше, чем немного перебор.

...