Lua中如何精确判断两个函数在行为和结构上完全相同?

2026-04-01 20:011阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计487个文字,预计阅读时间需要2分钟。

Lua中如何精确判断两个函数在行为和结构上完全相同?

能否以字节为单元获取函数大小,并查看其是否与另一个类似C+sizeof运算符的函数匹配,或以其他方式评估两个函数是否相等,但不知道函数具体是什么?例如:‘local’

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

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

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

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

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

如果不是不可能的话,这项任务相当困难.对于非常简单的案例,这里有一个想法:

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

f和g是两个与你的定义相同的函数.假设文件是​​t.lua,运行:

luac -l t.lua

输出是:

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

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

本文共计487个文字,预计阅读时间需要2分钟。

Lua中如何精确判断两个函数在行为和结构上完全相同?

能否以字节为单元获取函数大小,并查看其是否与另一个类似C+sizeof运算符的函数匹配,或以其他方式评估两个函数是否相等,但不知道函数具体是什么?例如:‘local’

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

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

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

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

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

如果不是不可能的话,这项任务相当困难.对于非常简单的案例,这里有一个想法:

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

f和g是两个与你的定义相同的函数.假设文件是​​t.lua,运行:

luac -l t.lua

输出是:

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

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