この第1版は、Lua 5.0向けに作成されました。以降のバージョンでも引き続き関連性が大きい部分もありますが、いくつかの違いがあります。
第4版は、Lua 5.3を対象としており、Amazonおよび他の書店で購入できます。
書籍を購入することで、Luaプロジェクトのサポートにも役立ちます。
![]() |
Programming inLua | ![]() |
第2部. テーブルとオブジェクト 第15章. パッケージ |
パッケージを定義する簡単な方法は、パッケージ内の各オブジェクトに接頭辞としてパッケージ名を使用することです。たとえば、複素数を操作するライブラリを記述しているとします。各複素数はテーブルとして表し、r
(実数部分)とi
(虚数部分)というフィールドを使用します。新しい操作をすべて別のテーブルに宣言すると、新しいパッケージとして機能します。
complex = {} function complex.new (r, i) return {r=r, i=i} end -- defines a constant `i' complex.i = complex.new(0, 1) function complex.add (c1, c2) return complex.new(c1.r + c2.r, c1.i + c2.i) end function complex.sub (c1, c2) return complex.new(c1.r - c2.r, c1.i - c2.i) end function complex.mul (c1, c2) return complex.new(c1.r*c2.r - c1.i*c2.i, c1.r*c2.i + c1.i*c2.r) end function complex.inv (c) local n = c.r^2 + c.i^2 return complex.new(c.r/n, -c.i/n) end return complexこのライブラリは、
complex
という1つの単一のグローバル名を定義します。他のすべての定義は、このテーブル内に入ります。この定義を使用すると、次のようにして、操作名を修飾して、すべての複素数操作を使用できます。
c = complex.add(complex.i, complex.new(10, 20))
パッケージにテーブルを使用するというこの方法は、実際のパッケージが提供する機能とまったく同じものではありません。まず、各関数定義にパッケージ名を明示的に配置する必要があります。次に、同じパッケージ内の別の関数を呼び出す関数は、呼び出される関数の名前を修飾する必要があります。固定ローカル名(たとえばP
)をパッケージに使用し、このローカル名をパッケージの最終的な名前に割り当てることで、これらの問題を改善できます。このガイドに従って、以前の定義を次のように記述します。
local P = {} complex = P -- package name P.i = {r=0, i=1} function P.new (r, i) return {r=r, i=i} end function P.add (c1, c2) return P.new(c1.r + c2.r, c1.i + c2.i) end ...関数が同じパッケージ内の別の関数を呼び出すとき(または、再帰的にそれ自体を呼び出すとき)、それでも名前の接頭辞が必要です。少なくとも、2つの関数間の接続はもはやパッケージの名前に依存しません。さらに、パッケージ全体でパッケージ名を記述するのは1か所だけです。
パッケージの最後のステートメントが次のとおりであったことに気付いたかもしれません。
return complexこの返りは必要ありません。なぜなら、パッケージはすでにグローバル変数(
complex
)に割り当てられているからです。それにもかかわらず、パッケージを開いたときにパッケージ自体が返されるという優れたプラクティスを検討しています。追加の戻り値はコストがかからず、パッケージを処理する別の方法を許可します。Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. | ![]() |