Lua 5.1.4
例如:
bar = {}
bar.name = 'test'
bar['123.com'] = function(self) print(self.name) end
我无法调用以下方法:
bar:['123.com']()
stdin:1: '<name>' expected near '['
以下作品:
bar['123.com'](bar)
但我有点难看。这种情况是否有语法糖?
或者如果真的不能这样做,Lua团队将来会添加这种语法吗?
或者他们是故意这样做的?
答案 0 :(得分:7)
不,我们不能像你想要的那样调用这个方法。您可能只想按照以下语法调用该方法。
bar['123.com'](bar)
答案 1 :(得分:4)
只需创建一个不以数字开头的别名并使用它。
bar.name123 = bar['123name']
bar:name123()
答案 2 :(得分:2)
没有人知道Lua维护者将在未来的版本中添加什么(他们非常接近),但我的猜测是他们不可能在没有被问到的情况下添加它 - 我从未见过在Lua邮件列表上请求这样的事情......
但是,我的直觉是,这个功能似乎模糊不清:人们真的想用这种“奇怪”的名字来调用方法的频率是多少?考虑到这一点,而且“解决方法”确实并不坏,目前还不清楚是否值得为实现提供复杂性来支持这样的功能(除非它完全无关紧要)。如果您想尝试询问,您应该将其发布到Lua邮件列表,这是大多数此类讨论的地方:lua-l@lists.lua.org
答案 3 :(得分:2)
您可能需要考虑以下内容(您可以在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
答案 4 :(得分:1)
您可以使用closure:
bar = {}
bar.name = 'test'
bar['123.com'] = function() print(bar.name) end
bar['123.com']()
function bar:addBar(name)
bar[name] = function() print(self.name) end
end
bar:addBar('456.com')
bar['456.com']()
答案 5 :(得分:1)
天啊......
bar = {
['123.com'] = function(self)
print("YAY!", self)
end
}
function f()
print(bar)
bar:WHATTHE()
end
function crazy(f, patt, repl)
local f_str = string.dump(f)
local newf_str = string.gsub(f_str, "WHATTHE", "123.com")
assert(#newf_str == #f_str, "replacement must be of same length")
local newf = loadstring(newf_str)
setfenv(newf, getfenv(f))
return newf
end
f = crazy(f, "WHATTHE", "123.com")
f()
--[[ Output:
table: 005EB688
YAY! table: 005EB688
]]
不要这样做 - 永远。