2010-09-04 132 views
8

我來自Python背景,非常喜歡Python裝飾器的強大功能。Lua是否支持裝飾器?

Lua是否支持裝飾器?

我讀過下面的鏈接,但目前還不清楚,對我說:http://lua-users.org/wiki/DecoratorsAndDocstrings

UPDATE

你還介意給出一個例子,如何如何實現它在Lua如果可能的話。

+1

Lua可以像Python一樣實現函數的包裝器;它只是沒有一個特殊的語法,因爲Lua的目標是擁有一個非常基本的核心語法(因爲它缺少像'continue'和'+ ='這樣的基本內容)。 – 2010-09-04 02:03:06

回答

9

在您引用的頁面中記錄的「裝飾器」(例如,在this one中用於添加類型檢查)與Python的奇怪名稱「裝飾器語法」沒有多大關係,可用於應用更高階的特定方式函數(HOF) - 相反,在Lua的wiki中描述和使用的裝飾器是Lua成語,用於支持將Decorator Design Pattern應用於Lua函數(通過保持「額外屬性」 - 例如文檔字符串,類型檢查函數等)單獨的全球表格)。 (我不確定你是否可以重新綁定函數名稱來應用HOF函數的結果,但是你可以很容易地使用,就像維基頁面顯示的那樣,使用匿名方法「原始函數」,並且僅將該名稱與該非函數的名稱綁定爲arg)。

Python的「裝飾者語法」語法糖是很好的(而且,令我驚訝的是,似乎大多數Pythonistas使用HOFs的次數增加了一個數量級!),但是對於你來說沒有任何內在的或本質的東西無法在Lua中完成(和Lua的匿名函數圍繞Python的愚蠢運行,限制lambda - 就像在Javascript中一樣,它們具有與「正常」命名函數基本相同的功能和幾乎相同的語法!) - )。

+1

你會介意給出一個關於如何在Lua中實現HOF的例子。謝謝 – nickb 2010-09-04 02:30:14

+1

@user,你引用的wiki頁面充滿了這樣的例子 - 函數接受函數參數和/或返回函數結果(按照定義,這就是高階函數,又名HOF,**是**).-) 。我認爲在我複製和粘貼任何這些示例或變體時,不會有任何附加價值! – 2010-09-04 04:06:08

+2

Lua中的函數是頭等值。他們根本沒有名字。通過將名稱存儲在該名稱的變量中,可以將該名稱「綁定」到某個函數。因此,重新綁定現有函數,您只需更換其值,當然,如果需要,請仔細保留對舊值的訪問權限。 – RBerteig 2010-09-04 19:45:12