开发者

lua - capturing variable assignments

开发者 https://www.devze.com 2023-01-05 23:39 出处:网络
Ruby has this very interesti开发者_如何学Cng functionality in which when you create a class with \'Class.new\' and assign it to a constant (uppercase), the language \"magically\" sets up the name of t

Ruby has this very interesti开发者_如何学Cng functionality in which when you create a class with 'Class.new' and assign it to a constant (uppercase), the language "magically" sets up the name of the class so it matches the constant.

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

It seems ruby "captures" the assignment and inserts sets the name on the anonymous class.

I'd like to know if there's a way to do something similar in Lua.

I've implemented my own class system, but for it to work I've got to specify the same name twice:

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

I'd like to get rid of that 'MyLuaClass' string. Is there any way to do this in Lua?


When assigning to global variables you can set a __newindex metamethod for the table of globals to catch assignments of class variables and do whatever is needed.


You can eliminate one of the mentions of MyLuaClass...

> function class(name,superclass) _G[name] = {superclass=superclass} end
> class('MyLuaClass',33)
> =MyLuaClass
table: 0x10010b900
> =MyLuaClass.superclass
33
> 


Not really. Lua is not an object-orientated language. It can behave like one sometimes. But far from every time. Classes are not special values in Lua. A table has the value you put in it, no more. The best you can do is manually set the key in _G from the class function and eliminate having to take the return value.

I guess that if it REALLY, REALLY bothers you, you could use debug.traceback(), get a stack trace, find the calling file, and parse it to find the variable name. Then set that. But that's more than a little overkill.


With respect at least to Lua 5.2: You can capture assignments to A) the global table of a Lua State, as mentioned in a previous reply, and also B) to any other Lua Object whose __index and __newindex metamethods have been substituted (by replacing the metatable), this I can confirm as I'm currently using both these techniques to hook and redirect assignments made by Lua scripts to external C/C++ resource management. There is a gotcha with regards to reading them back though, the trick is to NOT let the values be set in a Lua State. As soon as they exist there, your hooks will fail to be called, so if you want to go down this path, you need to capture ALL get/set attempts, and NEVER store the values in a Lua State.

0

精彩评论

暂无评论...
验证码 换一张
取 消