トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
Lua
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
___

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
















NINJAIDX 18