代码之家  ›  专栏  ›  技术社区  ›  user0721090601

制作报关单

  •  0
  • user0721090601  · 技术社区  · 5 年前

    假设我经常使用一组样板:

    class Foo {
    
      method abc($a: $b, $c, +@d) is pure {
        use Slang::Bar;
        …
      }
    
      method xyz($a: $b, $c, +@d) is pure {
        use Slang::Bar;
        …
      }
    
      method blarg($a: $b, $c, +@d) is pure {
        use Slang::Bar;
        …
      }
    
    }
    

    我宁愿只能说:

    class Foo is/does Bar {
      bar  abc   { … }
      bar  xyz   { … }
      bar  blarg { … }
    }
    

    在Bar中的某个地方,为Bar设置声明(或者,由于Foo类本身最终将使用自己的声明器,它可以去其他地方,不必在单独的Type中提取)。我该怎么做呢?

    0 回复  |  直到 5 年前
        1
  •  6
  •   Tinmarino    5 年前

    -1.限制(仅适用于包装)

    方法 EXPORTHOW 电话 .set_how 当前 $?LANG 为后者添加俚语。
    然后呢 add_package_declarator MAIN $?LANG 这增加了一个 package_declarator 其动作和语法的方法。我认为,这是世界上唯一的“动态俚语”。

    如果你想覆盖 routine_declarator 。然后你必须写一个俚语,模仿刚才引用的链条。 如果你接受保留方法关键字并在类中进行自动签名,比如根据方法名称,这是一种方法:

    注: 包是一个容器(包、语法、模块、角色、专有技术、枚举、类、子集)。如果你把代码像方法一样放在里面,就会执行(我刚刚尝试过):

    0.说明(出口展示)

    我会使用无证 出口方式 DECLARE 在一个 module 因为我没有找到一种方法 Phaser 显然,即使在开始阶段,也为时已晚。

    我举的例子是装饰类中的每个方法(甚至 BUILDALL ).

    1.Lib( decorator.rakumod )

    class DecoratedClassHOW is Metamodel::ClassHOW {
        method add_method(Mu $obj, $name, $code_obj) {
            sub wrapper ($obj, $a, $b) {
                say "Before $name";
                my $res = $code_obj($obj, $a, $b);
                say "After $name";
                return $res;
            }
            my $res = callwith($obj, $name, &wrapper);
            return $res;
        }
    }
    
    my module EXPORTHOW {
        package DECLARE {
            constant decorated = DecoratedClassHOW;
        }
    }
    

    2.可执行文件

    use lib '.';
    use decorator-lib;
    
    decorated Foo {
      method abc($a, $b) {
          say "In abc: $a:$b";
      }
    }
    
    my $f = Foo.new;
    $f.abc(1, 2);
    

    3.输出

    Before BUILDALL
    After BUILDALL
    Before abc
    In abc: 1:2
    After abc
    

    4.来源