Object 将数字作为对象,或存储数字的属性

Object 将数字作为对象,或存储数字的属性,object,properties,lua,overloading,modeling,Object,Properties,Lua,Overloading,Modeling,在设计代数方程建模系统时,我遇到了这样一个难题:我们无法将属性与数字相关联,例如,如果我将数字转换为带有字段“value”的表,我可以重载算术运算符,但不能重载逻辑运算符,因为只有当两个操作数具有相同的元表时,这才有效,而我的用户将比较“x”经常使用数字 例如,下面是一个最小方程解算器系统: x = 0 y = 0 eq1 = {function() return 2*x + 3*y end, rhs = 1 } eq2 = {function() return 3*x + 2*y end, r

在设计代数方程建模系统时,我遇到了这样一个难题:我们无法将属性与数字相关联,例如,如果我将数字转换为带有字段“value”的表,我可以重载算术运算符,但不能重载逻辑运算符,因为只有当两个操作数具有相同的元表时,这才有效,而我的用户将比较“x”经常使用数字

例如,下面是一个最小方程解算器系统:

x = 0
y = 0
eq1 = {function() return 2*x + 3*y end, rhs = 1 }
eq2 = {function() return 3*x + 2*y end, rhs = 2 }
p = {{x,y},{eq1, eq2}}
solve(p)
“solve()”将处理表“p”,以获得方程组和rhs的所有系数。但是,用户可以将属性与“x”和“y”相关联,例如下限、上限,这一点很重要。我试着用桌子

x = {val=0, lb=0, ub=3}
y = {val=1,lb=3,ub=5}
....

并为“x”和“y”编写元方法,这样算术运算将作用于x.val和y.val。然而,在脚本环境中,我们还需要将“x”与数字进行比较,即“如果x>0,那么…”。我被困在这里。一个丑陋的解决方案是要求用户在方程式建模和脚本编写过程中处处使用x.val、y.val。这里是否有人需要将属性与数字相关联,并且该数字仍然可以用于算术/逻辑运算

类似的方法可能会奏效:

x = {val = 10}

mt = {}
mt.__lt = function (op1, op2)
    if (type(op1) == 'table') then a = op1.val else a = op1 end
    if (type(op2) == 'table') then b = op2.val else b = op2 end

    return a < b
end

setmetatable(x, mt)

print(x < 5)   -- prints false
print(x < 15)  -- prints true
print(x < x)   -- prints false
print(5 < x)   -- prints true

如果您可以访问调试库,那么这相当简单,是吗

debug.setmetatable(0, meta)
meta将是所有数字的元表。这将解决您的逻辑重载问题。
但是,如果您希望将属性指定给数字,有一种方法可以做到这一点,我写了一个快速示例,说明如何做到这一点:

本地数字\u道具={ {val=“hi”}, {val=“hi2”} }


谢谢,Wander,不幸的是,不幸的是,它不适用于_eq,正如参考手册所说,“Lua将仅在比较的值是两个表或两个完整的用户数据且它们在本质上不相等时才尝试元方法。”我尝试打印(x==10),结果为false。这太烦人了@user3015347是的,恐怕对此无能为力。可以考虑添加自己的等值方法;无论如何,您可能都需要它,因为就目前情况而言,
x==x
但是
x~=y
即使
y.val
是10。@user3015347-是的,无法重新定义不同类型之间的相等性是Lua最恼人的缺点之一。看起来很简单!我不知道这对性能、健壮性等意味着什么。在对这个解决方案有信心之前,我已经了解了Lua内核是如何工作的。哎呀,这个解决方案有一个很深的漏洞。如果所有数字共享一个元表,则无法为不同的数字设置不同的属性,这与本文讨论的目的背道而驰。@user3015347我认为您的核心问题之一是逻辑元方法,只有当它们具有相同的元表时才起作用。好的,这样你就可以做到这一点。同样,很容易获得数字1的属性,以及数字2的完全不同的道具。是的,核心问题是相等比较,这需要双方都使用相同的元方法。。。。。。我做不到这一点,这正是我要找的。
debug.setmetatable(0, meta)
debug.setmetatable(0,{__index=function(self,k)return number_props[self][k]end})

print((1).val, (2).val)