为什么我不能在 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);
我可以在对象上调用 ^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);