Lua支持装饰器吗?

9

我来自Python背景,非常喜欢Python Decorators的强大功能。

Lua支持Decorators吗?

我阅读了下面的链接,但是我不清楚:http://lua-users.org/wiki/DecoratorsAndDocstrings

更新

如果可能的话,您能否给出一个在Lua中实现它的示例。


1
Lua可以像Python一样很好地实现函数包装器;只是它没有专门的语法,因为Lua旨在具有非常基本的核心语法(这是一个缺点,因为它缺少诸如continue+=等基本功能)。 - Glenn Maynard
1个回答

10
在你引用的页面上记录的“装饰器”(例如在这个中用于添加类型检查)与Python奇怪命名的“装饰器语法”(一种特定的应用高阶函数(HOF)的方法)几乎没有关系。相反,Lua维基中描述和使用的装饰器是一种Lua习惯用法,支持将装饰器设计模式应用于Lua函数(通过在单独的全局表中保存“额外属性”,如文档字符串、类型检查函数等)。
Lua确实支持HOFs(我不确定是否可以将函数名称重新绑定到应用HOFs到函数的结果,但是正如维基页面所示,您可以轻松地使用匿名“原始函数”,并仅使用该匿名函数作为参数将名称绑定到HOF的结果)。
Python的“装饰器语法”语法糖很好(令我惊讶的是,它似乎将大多数Pythonistas对HOFs的使用增加了一个数量级!-),但是没有任何内在或本质的东西不能在Lua中完成(而且Lua的匿名函数运行Python的笨拙、有限的lambda也差不多 - 就像在Javascript中一样,它们具有基本相同的功能和几乎相同的语法,就像“正常”的命名函数!-)。

2
您介意给出一个在Lua中实现高阶函数的例子吗?谢谢。 - nickb
1
@user,你引用的维基页面充满了这样的例子——函数接受函数参数和/或返回函数结果(这就是高阶函数的定义)。我认为复制粘贴其中任何一个例子或其变体都没有任何附加价值! - Alex Martelli
2
Lua 中的函数是一等值。实际上它们并没有名称。您可以通过将函数存储在相应名称的变量中来“绑定”名称与函数。因此,要重新绑定现有函数,只需替换其值即可。当然,如有需要,务必保留对旧值的访问权限。 - RBerteig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接