说明:
比较的两个对象必须指向相同的元方法(即 a@._lt === b@._lt ) |
两个表进行小于操作,要求其定义的元表中的 _lt 函数是同一个。
这里的同一个,是真正意义上的,指针(内存地址)一样的,而不仅仅是内容一样。
以下为错误方法:
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);