我正在用另一种语言进行远程过程调用,我不知道我调用的Lua函数是“类”还是“成员”函数。这很重要,因为我需要知道是否传入self
作为参数。有没有办法确定我调用的函数是成员函数还是类函数?
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()
在objInstance.get_name()
的情况下,我需要将self
作为参数传递给Lua函数。
答案 0 :(得分:1)
Lua中的功能没有区别。
它可以存储在'类中,也可以是全局功能,或者是'类成员'函数可以复制到局部变量中 - 没有办法确定函数是否是类或自由函数的一部分,因为Lua中没有类。您可以构建一个与类系统一样的系统,但它不是Java / C ++含义中的类。您可以在任何其他不相关的表上调用该函数,只要在该表中找到所有需要的数据,它就可以正常工作。
您可以通过使用debug.getlocal()
查看函数的第一个局部变量来进行猜测,因为参数计为局部变量。如果你看到" self"作为一个名称 - 这个函数有可能用冒号语法(function obj:method()
)声明,但这只是显式function obj.method(self)
声明的语法糖,而不是保证功能阶层关系。即使你得到了自我"作为第一个参数,它可以是一个自由函数,第一个参数名为" self"或" member"函数声明用点语法和显式" self"论点。你可能看不到" self" "成员"中的论点函数,如果它是用点语法声明的,还有一些其他名称要运行的对象,或debug.getlocal()
甚至可能无法找到参数名称,因为Lua源文件被预编译成字节码,调试信息被删除。
例如:
-- "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))