Luaの関数に違いはありません。
「クラス」に格納することも、グローバル関数にすることも、「クラスメンバ」関数をローカル変数にコピーすることもできます。関数がクラスの一部かフリーであるかを判断する方法はありませんなぜなら、Luaにはクラスがないからです。クラスシステムと同じように動作するシステムを構築できますが、Java/C++の意味ではクラスではありません。関連していない他のテーブルでその関数を呼び出すことができます。必要なすべてのデータがそのテーブルにある場合は正常に動作します。
引数のローカル変数としてカウントされるので、関数の最初のローカル変数であるdebug.getlocal()
を見ることで推測することができます。名前として "self"が表示されている場合、この関数がコロン構文(function obj:method()
)で宣言されている可能性がありますが、それは明示的なfunction obj.method(self)
宣言の文法的砂糖に過ぎず、関数クラス関係は保証されません。最初の引数として "self"を取得しても、最初の引数が "self"の自由関数、または "member"関数がドット構文と明示的 "self"引数で宣言されている可能性があります。 Luaのソースファイルがデバッグでバイトコードにプリコンパイルされているため、ドット構文で宣言されていて、オブジェクトの実行に別の名前が指定されていると、 "member"関数で "self"引数が見つからないことがあります。またはdebug.getlocal()
が引数名を見つけることさえできません。情報が取り除かれました。例えば
:
-- "free" function that is not related to any class
local generic_func = function(table, x)
return table.pos + x
end
-- object of some class
local obj = { pos = 1}
-- some unrelated table with "pos" element of string type
local unrelated = { pos = "42" }
-- define "method" with colon syntax, implicit "self" argument
function obj:func1(x)
return self.pos + x
end
-- define "method" with dot syntax, explicitly naming first argument
function obj.func2(object, x)
-- no "self" at all
return object.pos + x
end
-- put a "free function" in a "class"
obj.func3 = generic_func
-- identical results, no matter how you call it
print(obj:func1(2))
print(obj.func1(obj, 2))
print(obj:func2(2))
print(obj.func2(obj, 2))
print(obj:func3(2))
print(obj.func3(obj, 2))
print(generic_func(obj, 2))
-- "method" function from "obj" runs on unrelated table
print(obj.func1(unrelated, 2))
こちらをご覧ください:http://ideone.com/qRby6s
@idjaw、残念ながら、私は、Python側で実装するクラスを持っていない、実装はLuaの側にあると機能がありますRPC経由で使用されます。 –