Syntax 数字起始名称的Lua函数语法

Syntax 数字起始名称的Lua函数语法,syntax,lua,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 '[' 但我觉得这有点难看。在这种情况下有没有语法糖 或者如果它真的做不到,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 '['
但我觉得这有点难看。在这种情况下有没有语法糖

或者如果它真的做不到,Lua团队将来会添加这种语法吗


还是他们故意这么做?

不,我们不能像您希望的那样调用该方法。您应该仅按照以下语法调用该方法

bar['123.com'](bar)

不,我们不能像你想的那样调用这个方法。您应该仅按照以下语法调用该方法

bar['123.com'](bar)
您可以使用:

您可以使用:

哦,上帝

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
]]
不要这样做-永远

哦,上帝

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

不要这样做-曾经没有人知道Lua维护人员在未来的版本中会添加什么(他们的口风很紧),但我猜他们不太可能在至少没有被询问的情况下添加它,而且我从来没有在Lua邮件列表中看到这样的请求

不过,我的直觉是,这个功能似乎很模糊:人们真的希望用“奇怪”的名称调用方法的频率有多高?考虑到这一点,而且“变通方法”真的一点也不坏,因此不清楚是否值得为实现增加复杂性以支持这样一个功能(除非它是完全琐碎的)


如果您想尝试询问,您应该将其发布到Lua邮件列表中,这是大多数此类讨论发生的地方:
Lua-l@lists.lua.org

没有人知道Lua维护人员将在未来的版本中添加什么(他们的口才非常接近),但我的猜测是,他们不可能在没有被要求的情况下添加它,而且我从来没有在Lua邮件列表上看到过这样的请求

不过,我的直觉是,这个功能似乎很模糊:人们真的希望用“奇怪”的名称调用方法的频率有多高?考虑到这一点,而且“变通方法”真的一点也不坏,因此不清楚是否值得为实现增加复杂性以支持这样一个功能(除非它是完全琐碎的)


如果您想尝试询问,您应该将其发布到Lua邮件列表中,这是大多数此类讨论发生的地方:
Lua-l@lists.lua.org

只需制作一个不以数字开头的别名并使用它即可

bar.name123 = bar['123name']

bar:name123()

只需制作一个不以数字开头的别名并使用它即可

bar.name123 = bar['123name']

bar:name123()

你可能想考虑下面的内容(你可以在线测试):

您也可以更改
本身,使其以类似的方式运行,只是您必须在分配任何值之前执行此操作-例如:

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 = {}

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


这只在非常有限的情况下起作用。它不会在特定实例上调用它,因此您必须为您创建的每个实例创建一个新函数。我已经详细阐述了这个例子。然后答案是否定的,没有语法上的甜点,但你可以使用其他方法使它看起来像有一样。@Nicol:你必须为每个实例创建一个新的闭包,但只有一个函数。只是澄清一下这一点,因为我最近才了解到这一点。这只在非常有限的情况下起作用。它不会在特定实例上调用它,因此您必须为您创建的每个实例创建一个新函数。我已经详细阐述了这个例子。然后答案是否定的,没有语法上的甜点,但你可以使用其他方法使它看起来像有一样。@Nicol:你必须为每个实例创建一个新的闭包,但只有一个函数。只是澄清一下,因为我最近才了解到。通过方括号进行方法调用已经非常难看了(例如
bar['x']
而不是
bar.x
)。我怀疑解析器是否会被扩展来处理这种情况。但有时候,使用以数字开头的名称会更好。是吗?这看起来不像您在这里所做的:这看起来像是一种表驱动的方法,在这种情况下,您将要执行
object[selector](object)
。在另一个场景中,您需要一个名为“123.com”的方法吗?我正在编写一个库来解析一些网站。他们的名字可能很奇怪(甚至可能有一些亚洲字符),最好不要把它们翻译成英语,否则很难做到。无论名称是什么,我都想以同样的方式对待它们。对,这意味着一种数据驱动的方法,我想使用
table[selector]
anyhoo*耸耸肩*在任何情况下,我都是Lua的超级粉丝,并尝试尽我所能使用它,但如果你有一个网页抓取杂务,我强烈建议你检查Mechanize(Perl、Python、Ruby,也许还有其他),这就像拥有一个带有可查询DOM的GUI可编程浏览器一样。让这样的事情变得轻而易举。我希望Lua是拥有所有这些库支持的俱乐部的一员,但唉(我责备它的模块系统>)。通过方括号进行方法调用已经很难看了(例如
bar['x']
而不是
bar.x
)。我怀疑解析器是否会被扩展来处理这种情况。但有时候,使用以数字开头的名称会更好。是吗?这看起来不像您在这里所做的:这看起来像是一种表驱动的方法,在这种情况下,您将要执行
object[selector](object)
。在另一个场景中,您需要一个名为“123.com”的方法吗?我正在编写一个库来解析一些网站。他们的名字可能很奇怪(甚至可能有一些亚洲字符),最好不要把它们翻译成英语,否则很难做到。无论名称是什么,我都想以同样的方式对待它们。对,这意味着一种数据驱动的方法,我想使用
table[selector]
anyhoo*耸耸肩,不管怎样,我是Lua的超级粉丝