我可以调用^methods一个对象并列出我可以调用的方法名称:
my $object = 'Camelia';
my @object_methods = $object.^methods;
@object_methods.map( { .gist } ).sort.join("\n").say;
Run Code Online (Sandbox Code Playgroud)
^methods返回我存储的列表@object_methods,然后我通过调用gist每个方法来改变方法thingys的列表,以获得该方法的人类感知形式.
但是,^in ^methods是隐含的.HOW,如对象文档末尾所示,这也应该有效:
my $object = 'Camelia';
my @object_methods = $object.HOW.methods;
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误:
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...
Run Code Online (Sandbox Code Playgroud)
并且,对于它的价值而言,这对于一种试图对这类事物是个人友好的语言来说是一个可怕的错误信息.文件m-Metamodel.nqp不是我的perl6安装的一部分.它甚至不是我可以google的东西,因为正如路径所暗示的那样,它是汇编产生的东西.而且,编译取决于版本.
常规方法调用via .将调用者作为隐式的第一个参数传递给方法.元方法调用通过.^两个参数:元对象作为调用,实例作为第一个位置参数.
例如
$obj.^can('sqrt')
Run Code Online (Sandbox Code Playgroud)
是语法糖
$obj.HOW.can($obj, 'sqrt')
Run Code Online (Sandbox Code Playgroud)
在您的示例中,这将读取
my @object_methods = $object.HOW.methods($object);
Run Code Online (Sandbox Code Playgroud)