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

Why can't I call the methods method on a Perl 6's ClassHOW object?

我可以在对象上调用 ^methods 并列出我可以调用的方法名称:

my $object = 'Camelia';
my @object_methods = $object.^methods;
@object_methods.map( { .gist } ).sort.join("\n").say;

^methods returns a list which I store in @object_methods, then later I transform that list of method thingys by calling gist 在每一个上获得该方法的人类可感知的形式。

但是,^methods 中的 ^ 是隐含的 .HOW,如 object documentation 末尾所示,这也应该有效:

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

但是,我得到一个错误:

Too few positionals passed; expected 2 arguments but got 1
  in any methods at gen/moar/m-Metamodel.nqp line 490
  in block <unit> at...    

而且,就其价值而言,对于一种试图对这类事情进行人性化处理的语言来说,这是一条可怕的错误消息。文件 m-Metamodel.nqp 不是我的 perl6 安装的一部分。它甚至不是我可以 google 的东西,因为正如路径所暗示的那样,它是编译生成的东西。而且,该编译取决于版本。

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

例如

$obj.^can('sqrt')

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

在您的示例中,这将是

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