あなたはそうしない。少なくとも、Luaはあなたに話すつもりはありません。
function ClassName:myFunc( stuff )
Luaに関する限り、これは単なる構文糖衣です。これと違いはありません:ClassName.myFunc = function (self, stuff)
。機能は同等です。同様に、:call構文の場合、ClassName:myFunc(stuff)
意味的にはと同等ClassName.myFunc(ClassName, stuff)
です。
あなたの機能が何であるか、そしてそれらが何をするかを知るのはあなた次第です。これにはコーディングの規律が必要です。ループで呼び出す必要のある関数のリストがある場合は、同じパラメーターで呼び出すように設計する必要があります。
これを行うには2つの方法があります。1つの方法は、すべての関数を「クラス関数」にすることです。
someTable = {
ClassName.myFunc,
function(self, ...) return someGlobalFunc(...) end,
}
このように、self
パラメーターは無視されます。明らかに、ラッパーを自動的に生成する「グローバル」関数をテーブルに挿入するための関数を持つ特別な関数テーブルオブジェクトを作成できます。
function insertFuncIntoTable(self, func)
self[#self + 1] = function(self, ...) func(...) end
end
insertFuncIntoTable(someTable, someGlobalFunc)
注:「someGlobalFunc」が実際には(ではなく)グローバルテーブルのメンバーであると仮定すると、これらには違いがありますlocal
。このバージョンは、元のコードと同じように、_G["someGlobalFunc"]
現在の値を取ります。ただし、最初のバージョンは、呼び出されたときの値を取ります。これは、作成されたときの関数とは異なる可能性がありますsomeTable
。
したがって、このバージョンの方が安全です。
または、テーブル内の「クラス関数」がオブジェクトインスタンスに明示的にバインドされるようにすることもできます。
someTable = {
function(self, ...) ClassName.myFunc() end,
function(self, ...) return someGlobalFunc(...) end,
}
ところで、一般的に、:
構文を使用して関数を宣言する場合は、を介してその関数をそのように使用するinstance:myFunc(...)
ことになっています。明らかに、それは他の関数と同じように単なるLua関数なので、好きなことを行うことができます。しかし、誤用は何が起こっているのかを理解するのを難しくする可能性があります。
Luaはあなたにたくさんの力を与えます。ただし、コーディングするときは、判断と規律を行使する必要があります。Luaはあなたをあなた自身から(完全に)救うことはありません。