Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 比较不同类型的值_Types_Lua_Overloading_Operator Keyword - Fatal编程技术网

Types 比较不同类型的值

Types 比较不同类型的值,types,lua,overloading,operator-keyword,Types,Lua,Overloading,Operator Keyword,在不可接触程序的某个点上,对两个Lua值进行比较: return a==b; 我需要将此==转换为=,因此我进行了以下攻击: 这将给出预期的结果(true)。现在,问题是a和b处于不同的上下文中,因此我无法执行以下操作: setmetatable(a, mt) setmetatable(b, mt) 相反,我可以做到: mtA = { __eq = function (op1, op2) return op1.value >= op2.value end } setm

在不可接触程序的某个点上,对两个Lua值进行比较:

return a==b;
我需要将此
==
转换为
=
,因此我进行了以下攻击:

这将给出预期的结果(
true
)。现在,问题是
a
b
处于不同的上下文中,因此我无法执行以下操作:

setmetatable(a, mt)
setmetatable(b, mt)
相反,我可以做到:

mtA = {
  __eq = function (op1, op2) 
    return op1.value >= op2.value
  end
}
setmetatable(a, mtA)


mtB = {
  __eq = function (op1, op2) 
    return op1.value >= op2.value
  end
}
setmetatable(b, mtB)
但是,
a
b
是不同类型的,并且
=
操作符返回
false
,甚至没有到达我的
\uu eq
重载


关于如何实现我需要的东西有什么想法吗?

重写
\uuu eq
可以很好地处理Lua5.2下不同类型的对象;但是,在5.1下,只要两个元表都指向同一个函数,它就可以正常工作,如下所示:

local a, b = { value=5 }, { value=2 }

local function meta_eq(op1, op2) 
  return op1.value >= op2.value
end

setmetatable(a, { __eq = meta_eq })
setmetatable(b, { __eq = meta_eq })

print(a == b) -- true

也许还值得指出的是,除了
\uuuu eq
,还有
\uu gt
\uu ge
元方法分别覆盖>和>=。

都在独立的上下文中设置了“a”和“b”,因此对全局表所做的更改被删除。我无法访问真正的全局表。我对Lua5.1和5.2非常了解,5.0不太了解。我已经一分钟没想清楚了。但我有一个强烈的印象,你所要求的是不可能的。在5.2之前,它必须是分配给a和b的
\uu eq
的同一个函数对象才能被调用。如果您无法访问任何共享环境/表来保存该值,并且您无法更改比较的位置,那么在我看来,您似乎处于死胡同。@davidíaz,啊,这就是不同上下文的含义。我对Lua不太熟悉……如果您有权访问
require()
,则可以将函数存储在外部模块中,并从需要的每个上下文加载它;在第一次调用之后,每次后续调用
require()
,都会在
包中返回相同的条目。已加载的
,因此函数应该是相同的。@furq这是个好主意。事实上,他可以只在外部模块中存储一个空表,然后通过
require mymodule
检索它,然后在他的Lua代码中创建函数,并将其保存在表中以便稍后检索。或者他可以对一些他已经确定存储在
包中的表执行此操作。无法升级。无论如何,这给我带来了同样的问题:我没有放置函数(或元表)的公共位置。
local a, b = { value=5 }, { value=2 }

local function meta_eq(op1, op2) 
  return op1.value >= op2.value
end

setmetatable(a, { __eq = meta_eq })
setmetatable(b, { __eq = meta_eq })

print(a == b) -- true