你可能要考虑的东西像下面(你可以在http://www.lua.org/cgi-bin/demo在线测试):
bar = {}
bar.name = 'test'
bar['123.com'] = function(self) print(self.name) end
bar2 = setmetatable({}, {
__index = function(t, key)
return function(...)
return bar[key](bar, ...)
end
end
})
bar2['123.com']()
-- output: test
您还可以更改bar
本身以类似的方式来表现,只有你必须在做你分配任何值 - 例如:
bar = {}
local privatekey = {}
setmetatable(bar, {
__index = function(t, key)
local value = rawget(t, privatekey)[key]
if type(value) ~= 'function' then
return value
end
return function(...)
return value(t, ...)
end
end,
__newindex = function(t, key, value)
rawset(t, privatekey, rawget(t, privatekey) or {})
rawget(t, privatekey)[key] = value
end
})
bar.name = 'test'
bar['123.com'] = function(self) print(self.name) end
bar['123.com']()
-- output: test
通过方括号进行方法调用已经非常丑陋(例如'bar ['x']'而不是'bar.x')。我怀疑这个解析器是否会被扩展来处理这种情况。 – Mud 2012-04-19 00:44:50
但是有些时候,最好使用以数字开头的名称。 – 2012-04-26 02:16:43
是吗?这看起来并不像你在这里做的事情:这看起来像是一个表格驱动的方法,在这种情况下,你将会做'object [selector](object)'。在其他情况下,你想要一个名为“123.com”的方法? – Mud 2012-04-26 03:05:35