1. ホーム
  2. スクリプト・コラム
  3. ルア

Luaでモジュールを使用するための基本的なチュートリアル

2022-02-10 10:20:55

 モジュールとは何ですか?

モジュールは、ロードする必要があるグローバルに名付けられた1つのライブラリで使用できるようなもので、includeのテーブルを持っています。モジュールは、多くの関数や変数を含むことができます。これらの関数や変数はすべて、それを名前空間としてテーブルでラップされています。また、このテーブル上で必要なものを返すために必要な規定があり、非常に行儀の良いモジュールです。
Luaモジュール

テーブルの中でモジュールを使用すると、様々な点で役に立ちます。他のluaのテーブルを操作するのと同じように、モジュールを操作することができるようになります。モジュールを操作できる結果、luaのような特別な仕組みを必要とする言語の量に追加機能を提供します。luaモジュールのおかげで、この自由な方法で、ユーザーは様々な方法でLuaの関数を呼び出すことができます。例えば、以下のようなものです。

コピーコード コードは以下の通りです。
-- Assuming we have a module printFormatter
-- Also printFormatter has a funtion simpleFormat(arg)
-- Method 1
require "printFormatter"
printFormatter.simpleFormat("test")

-- Method 2
local formatter = require "printFormatter"
formatter.simpleFormat("test")

-- Method 3
require "printFormatter"
local formatterFunction = printFormatter.simpleFormat
formatterFunction("test")

上記のサンプルコードでは、特別な追加コードなしに、Luaのプログラミングがいかに柔軟であるかがわかります。
機能規定

Luaでは、必要なモジュールを全てロードするためにprescribeという高レベルの関数が用意されています。モジュールをロードするために、モジュールに関する情報が多くなりすぎないように、できるだけシンプルにしています。prescribe関数は、モジュールがいくつかの値をコードのブロックとして定義しており、それが実際には関数または含まれる関数のテーブルであると単純に仮定しています。

簡単な例として、ある関数が数学的演算を行い、このモジュールをmymathと呼び、ファイル名をmymath.luaとする場合を考えてみましょう。

コピーコード コードは以下の通りです。
local mymath = {}
function mymath.add(a,b)
   print(a+b)
end

function mymath.sub(a,b)
   print(a-b)
end

function mymath.mul(a,b)
   print(a*b)
end

function mymath.div(a,b)
   print(a/b)
end

return mymath 

さて、そのLuaモジュール内の別のファイル、moduletutorial.luaにアクセスすると、次のようになります。

コピーコード コードは以下の通りです。
mymathmodule = require("mymath")
mymathmodule.add(10,20)
mymathmodule.sub(30,20)
mymathmodule.mul(10,20)
mymathmodule.div(30,20)

このコードを実行するためには、2つのluaファイルを同じディレクトリに置くか、パッケージパスにモジュールファイルを置いて、追加の設定を生成する必要があります。上記のプログラムを実行すると、次のような出力が得られます。

コピーコード コードは以下の通りです。
30
10
200
1.5

覚えておきたいこと

  •     ファイルと同じディレクトリでモジュールを実行します。
  •     モジュール名とそのファイル名は同じである必要があります。
  •     これは関数を指定するリターンモジュールなので、ベストプラクティスの他のタイプの実装が他にあったとしても、上記のような良い実装をすることも可能です。

旧来のモジュール実装方法

同じ例を書き直してみましょう。すべての型に対する実装をチェックしてみてください。これはLuaのバージョン5.1と5.0を使っています。mathモジュールを以下に示します。

コピーコード コードは以下の通りです。
module("mymath", package.seeall)

function mymath.add(a,b)
   print(a+b)
end

function mymath.sub(a,b)
   print(a-b)
end

function mymath.mul(a,b)
   print(a*b)
end

function mymath.div(a,b)
   print(a/b)
end

moduletutorial.luaモジュールは、以下のように使用します。

コピーコード コードは以下の通りです。
require("mymath")
mymath.add(10,20)
mymath.sub(30,20)
mymath.mul(10,20)
mymath.div(30,20)

上記を実行すると、同じ出力が得られます。しかし、安全性が低いとされる古いバージョンのコードを使用することをお勧めします。Corona SDKのようなLuaでプログラミングするためのソフトウェア開発キットの多くは、時代遅れになっているのです。