ロジニキ雑記

マイクラ、プログラミング等雑記

Luaでオブジェクト指向1

最近OpenComputersと言うMinecraftのModを使うためにLuaというプログラミング言語を勉強しています。Luaは高速なスクリプト言語で、ゲームで使われることが多い?らしいです。動画投稿者の方はAviUtilなんかで使った事があるかもしれません。今回はそのLua言語でオブジェクト指向をしようと言うお話です。なお、一連の記事はLua5.3をベースにお話します。

そもそも、Luaはクラスベースのオブジェクト指向プログラミング(オブジェクト型)をサポートしていません。つまり自分で新たな型を定義し、オブジェクトの構造を静的に決定することが出来ません。Luaオブジェクト指向プログラミングをする場合はテーブルという機能を使うことになります。今回はLuaによるオブジェクト指向プログラミングの前提となるテーブルについて解説します。

テーブルの基本

テーブルはLua言語の機能の1つで、データを構造化するために使います。データはキーと値により対応付けされます。以下はテーブルのキーに数値型を使うことでテーブルを配列として使う場合の一例です。

local array = {"one", "two"; "three"}
print(array[1]) -- one
print(array[2]) -- two
print(array[3]) -- three

並括弧{}を「テーブルコンストラクタ」と呼びます。値をカンマ(,)、又はセミコロン(;)で区切ります。配列のインデックスは1始まりになります。これを次のように書き換えることができます。

local array1 = {
  [1] = "one",
  [2] = "two",
  [3] = "three"
}

local array2 = {}
array2[1] = "one"
array2[2] = "two"
array2[3] = "three"

array1ではテーブルコンストラクタ内でインデックスを指定して値を代入しています。一方、array2では一旦テーブルコンストラクタによりarray2を初期化したのち、後から値を代入しています。Javaの配列型と違い、事前に配列の長さを宣言する必要はありません。

テーブル型は参照型ですので、次のように別の変数に代入した場合はテーブルの参照のみがコピーされます。

local a = {"one"}
local b = a
a[1] = 1
print(b[1]) -- 1

変数bにはテーブルaの参照がコピーされているため、aの中身を書き換えることでbからアクセスした時も中身が変更されているように見えます。

テーブルのキーには数値型以外にも任意の型を使うことができます。以下は文字列型を使う場合の例です。

local table = {
  ["one"] = 1,
  ["two"] = 2,
  ["three"] = 3
}

キーに文字列型を使う場合は次のように書き換えることができます。

local table1 = {
  one = 1,
  two = 2,
  three = 3
}

local table2 = {}
table2.one = 1
table2.two = 2
table3.three = 3

table1では文字列リテラルを表すダブルクォート("")とテーブルのキーを表す角括弧を省略しています。table2ではテーブルアクセスに角括弧を使う代わりにピリオド(.)を使っています。

ここまでで、テーブルがC言語の構造体と配列を合わせたような機能だということがわかって頂けたかと思います。Luaのテーブルにはさまざまな省略記法がありますが、これらを組み合わせることであたかもJava等のオブジェクトを操作するかのような記述をすることが出来るようになります。次回は関数とテーブルの利用について解説します。