2012-04-18 67 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