これは、Luaのプログラマーが経験したようなものですか?そういうことに真の利点がありますか?
これは一般的ではありません。利点は、オブジェクトの状態がプライベートであることですが、それはそれを推奨するのに十分ではありません。
このパターンが繰り返し表示されます。
私はこれまで見たことがないし、投稿したソースで一度しか起こりません。
編集:この投稿の下のコメントに質問に対する回答を追加してください。
外部ローカル変数にアクセスする関数は、これらの変数にをバインドし、「クロージャ」と呼ばれます。 Lua(歴史的な理由から)は、それらの結合変数を「上位値」と呼んでいます。たとえば:あなたは出力から見ることができるよう
local function counter()
local i = 1
return function()
print(i)
i = i + 1
end
end
local a, b = counter(), counter()
a() a() a() b() --> 1 2 3 1
a
とb
はクロージャは、i
の異なるコピーにバインドされています。言い換えれば、クロージャーは独自のプライベートステートであると考えることができます。あなたは、オブジェクトをシミュレートするためにこれを使用することができます。
function Point(x,y)
local p = {}
function p.getX() -- syntax sugar for p.getX = function()
return x
end
function p.setX(x_)
x = x_
end
-- for brevity, not implementing a setter/getter for y
return p
end
p1 = Point(10,20)
p1.setX(50)
print(p1.getX())
Point
それぞれが地元の人々x
とy
に結合された、クロージャのテーブルを返します。テーブルにはポイントの状態は含まれておらず、クロージャ自体はその上位値によって行われます。重要な点は、Point
が呼び出されるたびに、新しいクロージャが作成されます。これは、大量のオブジェクトがある場合はあまり効率的ではありません。
Luaの中でクラスを作成する別の方法は、状態がテーブルに格納された状態で、最初の引数としてテーブルを取る関数を作成することです:
function Point(x,y)
local p = {x=x,y=y}
function p:getX() -- syntax sugar for p.getX = function(self)
return self.x
end
function p:setX(x)
self.x = x
end
return p
end
p1 = Point(10,20)
p1:setX(50) -- syntax sugar for p1.setX(p1, 50)
print(p1:getX()) -- syntax sugar for p1.getX(p1)
これまでのところ、我々はまだの新しいコピーを作成しています
PointClass = {}
function PointClass:getX() return self.x end
function PointClass:setX(x) self.x = x end
function Point(x,y)
return {
x = x,
y = y,
getX = PointClass.getX,
setX = PointClass.getY,
}
end
は今の方法は一度作成され、すべてのPoint
インスタンスは、同じクロージャを共有する:各メソッドは、今私たちは国家のために上位値に頼っていないことを、我々はそれを修正することができます。これを行うためのより良い方法は、新しいPoint
インスタンスが自動的にインスタンス自体では見られない方法のためにPointClass
に見えるようにするのLuaのメタプログラミング機能を使用することです:
PointClass = {}
PointClass.__index = PointClass -- metamethod
function PointClass:getX() return self.x end
function PointClass:setX(x) self.x = x end
function Point(x,y)
return setmetatable({x=x,y=y}, PointClass)
end
p1 = Point(10,20)
-- the p1 table does not itself contain a setX member, but p1 has a metatable, so
-- when an indexing operation fails, Lua will look in the metatable for an __index
-- metamethod. If that metamethod is a table, Lua will look for getX in that table,
-- resolving p1.setX to PointClass.setX.
p1:setX(50)
これはLuaの中のクラスを作成するための、より慣用的な方法です。より効率的で柔軟なメモリです(特に、継承を実装するのが簡単です)。それはこの場合には、読みやすさを向上するため
正しく簡略化しましたか?これらの例のいくつかに完全な形でリンクできますか? – Amber
ええ、あなたが投稿した 'パターン'はまったく意味がないようです。あなたはそれが "たくさん"、例にリンクすることができます参照してください言う? – Mud
私はより完全な例で質問を編集し、完全なソースアーカイブをダウンロードできるところを引用しました。ルアが私が知っている他の言語のようなものであれば、2番目のフォームはlessでより多くのことをするようです。 –