2

__indexメタテーブルで を定義する 2 つの方法を見続けています。

Account = {}
Account.__index = Account

function Account.create(balance)
   local self = { balance = balance }
   return setmetatable(self, Account)
end

または:

Account = {}

function Account.create(balance)
   local self = { balance = balance }
   return setmetatable(self, { __index = Account })
end

2つの動作の違いが何であるかはよくわかりません。誰かが私を啓発できますか?

4

1 に答える 1

3

違いは、作成されるテーブルの数と、作成されるテーブル チェーンです。

最初の例では、Account はすべてのインスタンスの共有メタテーブルと、メタメソッドのルックアップ先を兼ねています__index。次のようなチェーンを作成します。

instance -> Account, __index -> Account

2 番目の例では、メソッドから返された各インスタンスには、インスタンスと「クラス」のcreate間のブリッジとして機能する独自の一意のメタテーブルがあります。作成されたチェーン:

instance -> (anonymous, unique table), __index -> Account

テーブルが独自のメタテーブルとして機能する場合もあります。

Account = {}

function Account.create(balance)
   local self = { balance = balance, __index = Account }
   return setmetatable(self, self)
end

このチェーンを作成するもの:

instance -> instance, __index -> Account

1 番目と 3 番目のスタイルの利点は、作成されるテーブルが少ないことです。これにより、一部の実装が簡素化され、メモリ フットプリントが削減されます。2 番目のスタイルは、各インスタンスが個別に操作できる独自のメタテーブルを取得するため、間違いなくより堅牢です。

使用するスタイルは、プログラムの要件と、特定のスタイルの実装にどれだけ慣れているかによって異なります。

于 2016-08-16T11:30:21.033 に答える