表中自定义元表的小于操作运算符

光庆 6月前 460

以下为错误方法:

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 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);

以下为正确方法:

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);
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);



最新回复 (6)
  • 小肥羊 6月前
    0 2
     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);

    这样貌似可以成功,是不是恒等于的问题。

    小于运算、大于运算符
           比较的两个对象必须指向相同的元方法(即 a@._lt === b@._lt )


  • 小肥羊 6月前
    0 3
    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 )

  • 小肥羊 6月前
    0 4

    应该在代码里,元表实际是一个额外的固定的表,只能引用,不能重复定义,不然肯定不是恒等

  • 光庆 6月前
    0 5
    thedevil 貌似不是定义不成功, 而是 a
    快把话继续说完
  • 光庆 6月前
    0 6
    小肥羊 应该在代码里,元表实际是一个额外的固定的表,只能引用,不能重复定义,不然肯定不是恒等

    其实是要求_lt等定义函数,指向同一个函数指针即可。我为了省事,直接把整个元表指向同一指针了。并不是所以运算符都有这要求,_add等就可以随便定义。

  • 小肥羊 6月前
    0 7
    光庆 其实是要求_lt等定义函数,指向同一个函数指针即可。我为了省事,直接把整个元表指向同一指针了。并不是所以运算符都有这要求,_add等就可以随便定义。
    是的,看文档,只有小于,小于等于要求恒等的
返回