2017-07-04 7 views
1

私が呼び出すLua関数が 'クラス'か 'メンバ'関数かどうかわからない別の言語からリモートプロシージャコールを行っています。 selfを引数として渡すかどうかを知る必要があるので、これは重要です。呼び出す関数がメンバ関数かクラス関数かを判断する方法はありますか? objInstance.get_name()の場合Lua:オブジェクトが "クラス"か "インスタンス"かどうかを動的に判断

Luaのサーバー

function obj.get_sum(a, b, c) 
    return a + b + c 
end 
function obj:get_name() 
    return self.name 
end 

Pythonクライアント

objClass.get_sum(1, 2, 3) 
objInstance.get_name() 

、私はLuaの関数の引数としてselfを渡す必要があります。

+0

@idjaw、残念ながら、私は、Python側で実装するクラスを持っていない、実装はLuaの側にあると機能がありますRPC経由で使用されます。 –

答えて

1

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

関連する問題