gpt4 book ai didi

python - Lua:动态判断对象是 "class"还是 "instance"

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:55 25 4
gpt4 key购买 nike

我正在从另一种语言进行远程过程调用,我不知道我正在调用的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函数。

最佳答案

Lua 中的函数之间没有区别。

它可以存储在“类”中,也可以是全局函数,或者可以将“类成员”函数复制到局部变量中 - 无法确定函数是类的一部分还是自由函数,因为 Lua 中没有类。您可以构建一个行为类似于类系统的系统,但它不是 Java/C++ 含义中的类。您可以在任何其他不相关的表上调用该函数,只要在该表中找到所有需要的数据,它就会正常工作。

您可以通过使用 debug.getlocal() 查看函数的第一个局部变量来进行猜测,因为参数算作局部变量。如果您将“self”视为名称 - 有可能该函数是使用冒号语法声明的(function obj:method()),但这只是显式 function obj 的语法糖.method(self) 声明,而不是函数类关系的保证。即使您将“self”作为第一个参数,它也可能是第一个参数名为“self”的自由函数,或者使用点语法和显式“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))

请参见此处:http://ideone.com/qRby6s

关于python - Lua:动态判断对象是 "class"还是 "instance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44910923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com