第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但仍有一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还将帮助支持 Lua 项目


16.5 – 单方法方法

当对象只有一个方法时,会出现面向对象编程的前一种方法的特殊情况。在这种情况下,我们不需要创建一个接口表;相反,我们可以将这个单一方法作为对象表示返回。如果这听起来有点奇怪,那么值得记住第 7.1 节,我们在其中了解了如何构造将状态保留为闭包的迭代器函数。保留状态的迭代器只不过是一个单方法对象。

单方法对象的另一个有趣情况是,当这个单方法实际上是一个调度方法,它根据一个显式参数执行不同的任务时。此类对象的可能实现如下

    function newObject (value)
      return function (action, v)
        if action == "get" then return value
        elseif action == "set" then value = v
        else error("invalid action")
        end
      end
    end
它的用法很简单
    d = newObject(0)
    print(d("get"))    --> 0
    d("set", 10)
    print(d("get"))    --> 10

这种非传统的对象实现非常有效。语法 d("set",10) 虽然很奇怪,但仅比更传统的方法 d:set(10) 长两个字符。每个对象使用一个单一的闭包,比一个表更便宜。没有继承,但我们拥有完全的私有性:访问对象状态的唯一方法是通过其唯一方法。

Tcl/Tk 对其小部件使用类似的方法。Tk 中小部件的名称表示一个函数(一个小部件命令),该函数可以对小部件执行各种操作。