你可能要考慮的東西像下面(你可以在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