使用多个源文件包装方法

时间:2017-03-17 15:16:07

标签: perl6

我试图理解perl6中的包装是如何工作的。我正在使用此代码:

第一个文件(test.pl6):

use v6;
use lib '.';

use TestClass;

my TestClass $t .= new;
$t.wrapped(1, 7);

第二个文件(TestClass.pm6):

multi sub trait_mod:<is>(Routine:D \r, :$dummy!)
{
    r.wrap(sub (|)
    {
        say 'Dummy';
        callsame;
    });
}

unit class TestClass;

method wrapped($a, $b) is dummy
{
    say "Wrapped ($a, $b)";
}

执行 test.pl6 时,我得到:

Cannot invoke this object (REPR: Null; VMNull)
  in sub  at TestClass.pm6 (TestClass) line 5
  in any enter at gen/moar/Metamodel.nqp line 3999
  in block <unit> at test.pl6 line 7

当上面的所有代码都在同一个文件中时,它会工作并首先打印 Dummy 然后 Wrapped(1,7)

我做错了什么?

1 个答案:

答案 0 :(得分:4)

根据RT问题#129096,这是一个错误:“[BUG]子包裹着mod_trait:当导出产生神秘错误消息时,在同一单元中工作正常”。在2016年8月26日的评论中,这个错误列出了一些其他错误,记者认为这些错误是相关的,因为它们代表了“编译时关闭时丢失的外部上下文”错误。

相关错误列表中有一个a comment dated 10 April 2016表示:

  

我真的感到惊讶的是“无法调用此对象”   门票:

     

(RT search for that message)

     粗略地对这些进行的调查表明,它们都属于更广泛的范围   “没有幸存预编译的某种类型的代码属性”的类别

我没有回顾所有明显相关的错误,或者在#perl6-dev上询问开发人员对它们的看法。