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

光庆 10月前 779

以下为错误方法:

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



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

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

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


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

    • 小肥羊 10月前
      0 4

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

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

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

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