4

デフォルトのテーブルを作成し、他のテーブルを作成するときにそれを使用するにはどうすればよいですか?

--default table
Button = {
 x = 0,
 y = 0,
 w = 10,
 h = 10,
 Texture = "buttonimg.png",
 onClick = function() end
}

newbutton = Button {
 onClick = function()
  print("button 1 pressed")
 end
}


newbutton2 = Button {
 x = 12,
 onClick = function()
  print("button 2 pressed")
 end
}

newbuttons は y、w、h およびテクスチャをデフォルト値に設定しますが、括弧内に設定されたものはすべて上書きされます

4

2 に答える 2

4

次のように、Doug の回答を元のシナリオとマージすることで、目的を達成できます。

Button = {
   x = 0,
   y = 0,
   w = 10,
   h = 10,
   Texture = "buttonimg.png",
   onClick = function() end
}
setmetatable(Button,
         { __call = function(self, init)
                       return setmetatable(init or {}, { __index = Button })
                    end })

newbutton = Button {
   onClick = function()
                print("button 1 pressed")
             end
}

newbutton2 = Button {
   x = 12,
   onClick = function()
                print("button 2 pressed")
             end
}

(私は実際にこれをテストしましたが、動作します。)

編集:これを次のように少しきれいにして再利用可能にすることができます:

function prototype(class)
   return setmetatable(class, 
             { __call = function(self, init)
                           return setmetatable(init or {},
                                               { __index = class })
                        end })
end

Button = prototype {
   x = 0,
   y = 0,
   w = 10,
   h = 10,
   Texture = "buttonimg.png",
   onClick = function() end
}

...
于 2009-02-06T12:17:22.943 に答える
0

新しいテーブルのメタテーブル__indexを指すようButtonに設定すると、テーブルのデフォルト値が使用されButtonます。

--default table
Button = {
 x = 0,
 y = 0,
 w = 10,
 h = 10,
 Texture = "buttonimg.png",
 onClick = function() end
}

function newButton () return setmetatable({},{__index=Button}) end

ボタンを作成するとnewButton()、テーブルのデフォルト値が使用されButtonます。

この手法は、クラスまたはプロトタイプのオブジェクト指向プログラミングに使用できます。ここには多くの例があります。

于 2009-02-06T04:02:26.343 に答える