为什么我不能在Perl 6的ClassHOW对象上调用方法?

时间:2016-03-05 19:48:57

标签: metaclass perl6

我可以在一个对象上调用tclsh并列出我可以调用的方法名称:

^methods

^methods返回一个我存储在my $object = 'Camelia'; my @object_methods = $object.^methods; @object_methods.map( { .gist } ).sort.join("\n").say; 中的列表,然后我通过在每个方法上调用gist来转换方法thingys列表,以获得该方法的人类感知形式啄。

但是,@object_methods中的^是隐含的^methods,如object documentation所示,这也应该有用:

.HOW

但是,我收到一个错误:

my $object = 'Camelia';
my @object_methods = $object.HOW.methods;

并且,对于它的价值,这对于一种试图对这类事物友好的语言来说是一个可怕的错误信息。文件 m-Metamodel.nqp 不是我的perl6安装的一部分。它甚至不是我可以google的东西,因为正如路径所暗示的那样,它是汇编产生的东西。而且,编译取决于版本。

1 个答案:

答案 0 :(得分:5)

通过.的常规方法调用将调用者作为隐式的第一个参数传递给方法。通过.^的元方法调用传递两个参数:元对象作为调用者,实例作为第一个位置参数。

例如

$obj.^can('sqrt')

的语法糖
$obj.HOW.can($obj, 'sqrt')

在您的示例中,这将是

my @object_methods = $object.HOW.methods($object);