以下为错误方法:
Code AardioLine:21复制 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.import console; class ccc{ ctor(){ this@ = { _add = function(b){ // +运算 import console; console.dump("++++++++++++++++++"); return 123.456; } _lt = function(b) { // <运算 import console; console.dump("<<<<<<<<<<<<<<<<<<"); return false; }; } };}var a,b = ccc(),ccc();console.dump(a+b);console.dump(a<b);console.pause(true);
import
class
ctor
this
function
// +运算
"++++++++++++++++++"
return
123
456
// <运算
"<<<<<<<<<<<<<<<<<<"
false
var
true
Code AardioLine:29复制 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.import console; var a,b = {},{};a@ = { _add = function(b){ // +运算 import console; console.dump("++++++++++++++++++"); return 123.456; } _lt = function(b) { // <运算 import console; console.dump("<<<<<<<<<<<<<<<<<<"); return false; };}b@ = { _add = function(b){ // +运算 import console; console.dump("++++++++++++++++++"); return 123.456; } _lt = function(b) { // <运算 import console; console.dump("<<<<<<<<<<<<<<<<<<"); return false; };}console.dump(a+b);console.dump(a<b);console.pause(true);
以下为正确方法:
Code AardioLine:22复制 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.import console; var metatable = { _add = function(b){ // +运算 import console; console.dump("++++++++++++++++++"); return 123.456; } _lt = function(b) { // <运算 import console; console.dump("<<<<<<<<<<<<<<<<<<"); return false; };}class ccc{ ctor(){ this@ = metatable; };}var a,b = ccc(),ccc();console.dump(a+b);console.dump(a<b);console.pause(true);
Code AardioLine:19复制 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.import console; var metatable = { _add = function(b){ // +运算 import console; console.dump("++++++++++++++++++"); return 123.456; } _lt = function(b) { // <运算 import console; console.dump("<<<<<<<<<<<<<<<<<<"); return false; };}var a,b = {},{};a@ = metatable;b@ = metatable;console.dump(a+b);console.dump(a<b);console.pause(true);
Code AardioLine:23复制 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.import console; a = { xxx=1111; @{ _add = function(b){ import console; console.log("成功运行了 add") return 111; } _lt = function(b){ import console; console.log("成功运行了 _lt") return false; } }}b = table.clone(a);b.xxx = 2222;..console.dump(a+b)..console.dump(a<b)console.pause(true);
1111
"成功运行了 add"
111
"成功运行了 _lt"
table
2222
这样貌似可以成功,是不是恒等于的问题。
小于运算、大于运算符 比较的两个对象必须指向相同的元方法(即 a@._lt === b@._lt )
Code AardioLine:24复制 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.import console; class ccc{ ctor(){ this@ = { _add = function(b){ // +运算 import console; console.dump("++++++++++++++++++"); return 123.456; } _lt = function(b) { // <运算 import console; console.dump("<<<<<<<<<<<<<<<<<<"); return false; }; } };}var a = ccc();b = table.clone(a)console.dump(a+b);console.dump(a<b);console.pause(true);
同样,这个也可以,不能直接new,必须clone之后的原表才满足 (比较的两个对象必须指向相同的元方法(即 a@._le === b@._le ))
应该在代码里,元表实际是一个额外的固定的表,只能引用,不能重复定义,不然肯定不是恒等
thedevil 貌似不是定义不成功, 而是 a
小肥羊 应该在代码里,元表实际是一个额外的固定的表,只能引用,不能重复定义,不然肯定不是恒等
其实是要求_lt等定义函数,指向同一个函数指针即可。我为了省事,直接把整个元表指向同一指针了。并不是所以运算符都有这要求,_add等就可以随便定义。
光庆 其实是要求_lt等定义函数,指向同一个函数指针即可。我为了省事,直接把整个元表指向同一指针了。并不是所以运算符都有这要求,_add等就可以随便定义。