Syntax 数字起始名称的Lua函数语法
Lua 5.1.4 例如: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团队将来会添加这种语法吗 还是他们故意这么做?不,我们不能像您希望的那样调用该方法。您应该仅
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的超级粉丝