一起定义具有多个 API 版本的类

jjm*_*elo 6 mop raku

这显然是不可能的……

role Versioned {
    method version () {
        return self.^api;
    }
}

class WithApi:ver<0.0.1>:auth<github:JJ>:api<0> does Versioned {}
class WithApi:ver<0.0.1>:auth<github:JJ>:api<1> does Versioned {}

say WithApi:api<0>.new.version;
say WithApi:api<1>.new.version;
Run Code Online (Sandbox Code Playgroud)

这与

==SORRY!=== Error while compiling /home/jmerelo/progs/perl6/my-perl6-examples/api-versioned.p6
Redeclaration of symbol 'WithApi'
at /home/jmerelo/progs/perl6/my-perl6-examples/api-versioned.p6:11
------> 1>:auth<github:JJ>:api<1> does Versioned? {}
Run Code Online (Sandbox Code Playgroud)

那么甚至有可能在单个程序中use使用不同的apis、相同的名称吗?

更新:如果它们包含在不同的文件中,这是获得的错误:

P6M Merging GLOBAL symbols failed: duplicate definition of symbol WrongType
Run Code Online (Sandbox Code Playgroud)

Eli*_*sen 7

在这个例子中,有两件事造成了问题:

  • class默认情况下是our,这会导致名称冲突
  • 类的短名称在外部命名空间中相同,导致冲突

如果我们稍微修改一下代码:

role Versioned {
    method version () {
        return self.^api;
    }
}

my constant one = my class WithApi:ver<0.0.1>:auth<github:JJ>:api<1> does Versioned {}
my constant two = my class WithApi:ver<0.0.1>:auth<github:JJ>:api<2> does Versioned {}

say one.version;  # 1
say two.version;  # 2
Run Code Online (Sandbox Code Playgroud)

我确实发现:api<0>. 显然这被认为相当于没有 :api设置,导致空字符串而不是0.

  • 在我们实现对 `:as` 的支持之前,一种方法是将文件导入两个不同的块中。类似于: `constant Foo = do { use Test; 测试 }; dd 富;# 测试` (3认同)
  • 这将如何转化为使用同一个类的不同 api 版本创建两个文件?导出的符号需要有不同的名称吗? (2认同)