初版は Lua 5.0 向けに書かれました。後続のバージョンでもほとんどは関連していますが、若干の違いがあります。
第 4 版は Lua 5.3 を対象としており、Amazon やその他の書店で購入できます。
この本を購入することで、Lua プロジェクトの支援にも貢献できます。


16.5 - 単一メソッドのアプローチ

前節で説明した OO プログラミングのアプローチには、オブジェクトが単一のメソッドを持つ場合に適した特別なケースがあります。このような場合は、インターフェイステーブルを作成する必要はなく、その単一メソッドをオブジェクトの表現として返すことができます。少し奇妙に思えるかもしれませんが、第 7.1 節 で説明したクロージャとして状態を保持するイテレータ関数の作成方法について思い出してみるといいでしょう。状態を保持するイテレータは、単一のメソッドを持つオブジェクトに他なりません。

単一メソッドオブジェクトのもう 1 つの興味深いケースは、この単一メソッドが実際には区別された引数に基づいてさまざまなタスクを実行するディスパッチメソッドの場合です。このようなオブジェクトの 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)よりも一見奇妙ですが、わずか 2 文字しか長くありません。各オブジェクトは 1 つの単一クロージャを使用し、テーブル 1 つよりも安価です。継承はありませんが、完全なプライバシーが得られます。オブジェクトの状態にアクセスする方法は、その単一のメソッドを介することだけです。

Tcl/Tk では、ウィジェットに対して同様のアプローチが使用されます。Tk でウィジェットの名前は、そのウィジェットに対するあらゆる種類の操作を実行できる関数(ウィジェットコマンド)を表します。