■ クラスの定義
POINT
Lua は Table を利用して Object をあらわす。
構造体としてとらえることも可能
Method の実体は Table の Field の値として関数があるだけ。
Lua Table を利用することで, Object を作成できる。 { data , method ... }
キーをメンバ変数名とみなせば、構造体としても表現できる。
Method には InstanceData をわたしたい.
file.open( file ) ---> file:open(); となる.
-- MetaTable
Colormeta = {
-- + の演算はこの関数でオーバーライド
__add = function(a, b)
local r, g, b = (a.r+b.r), (a.g+b.g), (a.b+b.b)
return newrgb( r, g, b );
end,
-- 文字列表現
__tostring = function(a)
return string.format("rgb %3d %3d %3d", a.r, a.g, a.b )
end,
}
-- ctor
function Color( r, g, b )
local tbl = { r = r or 0, g = g or 0, b = b or 0 };
-- 毎度設定しないとだめ
setmetatable( tbl, Colormeta );
return tbl;
end
-- テーブルを作成して返す
g = Color(0, 255, 0);
b = Color(0, 0, 255);
-- MetaMethod を使う。
cyn = g + b;
print( cyn );
function T.new(value)
--
local obj = {
value = value,
toString = function(self)
return "T: value=" .. tostring(value)
end
}
return obj
end
-- new clsFoo(); の模倣.
obj = T.new(5)
print( obj:toString() )
obj2 = T.new(7)
print( obj2:toString() )
■ メソッドの定義
POINT
: を記述することで, メソッドのような記述ができる。
obj:function() とすると, 第一引数に暗黙のパラメータとして obj 自身がわたる。
実体は obj.function( obj ); と同じ。
( 構造体もある意味で 連想 Table -> obj.key = val )
String = {
-- メンバ変数
val = 3,
-- { KEY , 関数body } でメソッドらしくする。
-- . の代わりに : で代用する。
toString = function(self)
return "value=" .. tostring( self.val )
end
}
次のように使う
String:toString();
-- これと同じ
String.toString( self );
[ : ] を利用した関数定義
function object:read( a, b, c )
-- self は local 変数
print( self );
end
function object.read( self, a, b, c )
-- self は local 変数
print( self );
end
新規の型を定義できないため、クラスのインスタンスを作成するには
コンストラクタに相当する関数内でテーブルを作成して返す。
function Vector( x, y, z )
-- インスタンスに相当するテーブルを作成
local tbl = { x=x, y=y, z=z }
-- メソッドを定義
tbl.length = function( self )
return math.sqrt( self.x*self.x + self.y*self.y + self.z*self.z )
end
tbl.normalize = function( self )
local n = self:length()
self.x = self.x / n
self.y = self.y / n
self.z = self.z / n
end
return tbl
end
-- インスタンスを作成
local v = Vector( 1, 2, 3 )
-- メソッドをよびだす
v:normalize()
local len = v:length()
print ( len )
■ Closure
source code 上のまとまりのある単体.
Cの関数を作成するとき、いくつかの値を関連付けて Cのクロージャ を作ることができる。
( 関数に変数を付属させたもの関数のこと )
( 関数内で使用するdataを関数内にとじこめる )
Table とは異なり, data を隠ぺいすることができる。
a = {}
local x = 20
for i=1,10 do
local y = 0
a[i] = function () y=y+1; return x+y end
end
クロージャはすべて同じ x を参照するが、それぞれ異なった y を参照する。
(y の解決を実行時の環境ではなく、 定義時の環境で行っているため.
for i=1,10 do
print(a[i]())
end
-- 実行結果は 21 が 10 個表示される