2012-04-18 66 views
1

的Lua 5.1.4的Lua函数的语法糖的数字开始命名

例如:

bar = {} 
bar.name = 'test' 
bar['123.com'] = function(self) print(self.name) end 

我不能调用方法如下图所示:下面的作品

bar:['123.com']() 
stdin:1: '<name>' expected near '[' 

Althought :

bar['123.com'](bar) 

但我这是索姆多么丑陋。这种情况是否有语法糖?

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

或者他们故意这么做?

+0

通过方括号进行方法调用已经非常丑陋(例如'bar ['x']'而不是'bar.x')。我怀疑这个解析器是否会被扩展来处理这种情况。 – Mud 2012-04-19 00:44:50

+0

但是有些时候,最好使用以数字开头的名称。 – 2012-04-26 02:16:43

+0

是吗?这看起来并不像你在这里做的事情:这看起来像是一个表格驱动的方法,在这种情况下,你将会做'object [selector](object)'。在其他情况下,你想要一个名为“123.com”的方法? – Mud 2012-04-26 03:05:35

回答

2

没有人知道Lua的维护人员会在未来的版本中添加什么(他们很贴切),但我的猜测是,他们不太可能会添加它,至少没有被问到—,我从未见过在Lua邮件列表上请求这样的事情......

虽然我的直觉是这个功能似乎很模糊:人们真的想用这样的“奇怪”名称调用方法的频率如何?鉴于此,“解决方法”实际上并不糟糕,目前尚不清楚是否值得增加实现的复杂性以支持这种功能(除非它是完全微不足道的)。

如果你想尝试问,你应该张贴它到Lua邮件列表,这是大多数这样的讨论发生:[email protected]

+0

我认为任何语言都应该始终坚持其语法风格。或者他们故意这样做?谢谢,我会尽力邮寄给他们。 – 2012-04-19 13:30:36

7

不,我们不能像你想要的那样调用方法。你只需要按如下语法调用该方法。

bar['123.com'](bar) 
+0

这不是我想要的,我已经在我的问题中写下了它们。请不要重复。 – 2012-04-19 13:18:57

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']() 
+0

只适用于非常有限的情况。它不会在特定实例上调用它,因此您必须为您创建的每个实例创建一个新函数。 – 2012-04-18 04:27:42

+0

给出的用例是有限的。我已经详细阐述了这个例子。 – six8 2012-04-18 04:34:59

+1

我正在寻找一种语法糖,而不是苦咖啡,谢谢。 – 2012-04-18 04:56:09

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

不要这样做 - 不断

4

只是让不以数字和使用开始的别名。

bar.name123 = bar['123name'] 

bar:name123() 
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