Lua - 是否可以检查两个函数是否相等?

能否获取函数的字节数以查看是否与另一个类似于 C++ sizeof 运算符的函数匹配,或以其他方式评估两个函数是否相等,而不必实际了解函数是什么?例如:

local function equals(func1, func2)
   -- check them and return true if equal
end

如果这不可能,请说出来,那将满足我的答案!谢谢!

编辑:我需要检查一个函数的主体,以查看它是否与另一个函数的主体相同。存储器中的引用将不同,因此我不能使用“==”,但函数的引用名称可以不同。

点赞
用户1009479
用户1009479

使用 == 仅检查函数是否引用相同的函数,这不是你所期望的。

如果只考虑非常简单的情况,这项任务可能相当困难,甚至不可能完成。以下是一个想法:

function f(x) return x + 1 end
local g = function(y) return y + 1 end

fg 是两个按照你的定义相等的函数。假设文件名为 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

如你所见,这两个函数在虚拟机中具有相同的指令。

2015-06-09 17:55:43
用户44740
用户44740

将字节代码进行比较,可以吗?

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

两个函数都执行相同的任务,但是它们生成不同的字节代码。也许,如果你说明你想实现什么,比函数比较更好的解决方案会被提供。

2015-06-09 18:00:38