用于数字起始名称的Lua函数语法糖

时间:2012-04-18 04:12:50

标签: syntax lua

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团队将来会添加这种语法吗?

或者他们是故意这样做的?

6 个答案:

答案 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
]]

不要这样做 - 永远