Class





クラスの定義


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 個表示される