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

时间:2015-06-09 17:00:55

标签: function lua byte equals

是否有可能以字节为单位获取函数的大小以查看它是否与另一个类似于C ++ sizeof运算符的函数匹配,或者以其他方式评估两个函数以查看它们是否相等而不实际知道函数/是吗?例如:

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

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

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

2 个答案:

答案 0 :(得分:6)

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

这项任务相当困难,甚至根本不可能。对于非常简单的案例,这里有一个想法:

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

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

答案 1 :(得分:6)

比较字节码吗?

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

两个函数都做同样的事情,但它们生成不同的字节码。也许如果你陈述你想要实现的目标,可以提供比功能比较更好的解决方案。