Lua - 是否可以检查 2 个函数是否相等?
Lua - Is it possible to check if 2 functions are equal?
是否可以获取一个函数的大小(以字节为单位)以查看它是否与另一个类似于 C++ sizeof 运算符的函数相匹配,或者以其他方式评估两个函数以查看它们是否相等而实际上不知道它们是什么function/s是?示例:
local function equals(func1, func2)
-- check them and return true if equal
end
如果这不可能,请说出来,这将满足我的回答!
谢谢!
编辑:我需要检查一个函数的主体是否与另一个函数的主体相同。内存中的引用会有所不同,所以我不能使用“==”,但函数的引用名称可以不同。
对函数使用 ==
仅检查它们是否引用相同的函数,这不是您所期望的。
这个任务即使不是不可能,也是相当困难的。对于非常简单的情况,这里有一个想法:
function f(x) return x + 1 end
local g = function(y) return y + 1 end
f
和 g
是您定义的两个相等的函数。假设文件是 t.lua
, 运行:
luac -l t.lua
输出为:
main <t.lua:0,0> (4 instructions at 00000000003081c0)
0+ params, 2 slots, 1 upvalue, 1 local, 1 constant, 2 functions
1 [1] CLOSURE 0 0 ; 0000000000308330
2 [1] SETTABUP 0 -1 0 ; _ENV "f"
3 [2] CLOSURE 0 1 ; 0000000000308dc0
4 [2] RETURN 0 1
function <t.lua:1,1> (3 instructions at 0000000000308330)
1 param, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions
1 [1] ADD 1 0 -1 ; - 1
2 [1] RETURN 1 2
3 [1] RETURN 0 1
function <t.lua:2,2> (3 instructions at 0000000000308dc0)
1 param, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions
1 [2] ADD 1 0 -1 ; - 1
2 [2] RETURN 1 2
3 [2] RETURN 0 1
可以看到,这两个函数在虚拟机中的指令是一样的
比较字节码可以吗?
local function equals(func1, func2)
return string.dump(func1) == string.dump(func2)
end
当然,在某些情况下上述方法会失败。例如:
local function f1 (...)
local a = print
a(...)
end
local function f2 (...)
print(...)
end
local function equals (f1, f2)
return string.dump(f1) == string.dump(f2)
end
print(equals(f1,f2)) --> false
这两个函数做同样的事情,但它们生成不同的字节码。也许如果你陈述你想要达到的目标,可以提供比功能比较更好的解决方案。
是否可以获取一个函数的大小(以字节为单位)以查看它是否与另一个类似于 C++ sizeof 运算符的函数相匹配,或者以其他方式评估两个函数以查看它们是否相等而实际上不知道它们是什么function/s是?示例:
local function equals(func1, func2)
-- check them and return true if equal
end
如果这不可能,请说出来,这将满足我的回答! 谢谢!
编辑:我需要检查一个函数的主体是否与另一个函数的主体相同。内存中的引用会有所不同,所以我不能使用“==”,但函数的引用名称可以不同。
对函数使用 ==
仅检查它们是否引用相同的函数,这不是您所期望的。
这个任务即使不是不可能,也是相当困难的。对于非常简单的情况,这里有一个想法:
function f(x) return x + 1 end
local g = function(y) return y + 1 end
f
和 g
是您定义的两个相等的函数。假设文件是 t.lua
, 运行:
luac -l t.lua
输出为:
main <t.lua:0,0> (4 instructions at 00000000003081c0)
0+ params, 2 slots, 1 upvalue, 1 local, 1 constant, 2 functions
1 [1] CLOSURE 0 0 ; 0000000000308330
2 [1] SETTABUP 0 -1 0 ; _ENV "f"
3 [2] CLOSURE 0 1 ; 0000000000308dc0
4 [2] RETURN 0 1
function <t.lua:1,1> (3 instructions at 0000000000308330)
1 param, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions
1 [1] ADD 1 0 -1 ; - 1
2 [1] RETURN 1 2
3 [1] RETURN 0 1
function <t.lua:2,2> (3 instructions at 0000000000308dc0)
1 param, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions
1 [2] ADD 1 0 -1 ; - 1
2 [2] RETURN 1 2
3 [2] RETURN 0 1
可以看到,这两个函数在虚拟机中的指令是一样的
比较字节码可以吗?
local function equals(func1, func2)
return string.dump(func1) == string.dump(func2)
end
当然,在某些情况下上述方法会失败。例如:
local function f1 (...)
local a = print
a(...)
end
local function f2 (...)
print(...)
end
local function equals (f1, f2)
return string.dump(f1) == string.dump(f2)
end
print(equals(f1,f2)) --> false
这两个函数做同样的事情,但它们生成不同的字节码。也许如果你陈述你想要达到的目标,可以提供比功能比较更好的解决方案。