2016-03-05 137 views
4

我可以调用的对象上^methods并列出方法名我可以调用:为什么我不能在Perl 6的ClassHOW对象上调用methods方法?

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

^methods返回其余存储在@object_methods列表,然后后来我通过对每一个呼叫gist变换方法thingys的该列表以获得该方法的人类合理形式。

但是,在^methods^是在object documentation结束隐含.HOW,如显示这应该工作太:

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安装的一部分。这甚至不是我可以谷歌的东西,因为,正如路径所示,这是编译生成的东西。而且,该编译取决于版本。

回答

5

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

例如

$obj.^can('sqrt') 

$obj.HOW.can($obj, 'sqrt') 

在您的例子语法糖,这将读

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

这哪里是记录? –

+3

在与链接到的语言/对象完全相同的文档中,它表示:“元对象方法的调用约定是调用元对象上的方法,并将感兴趣的对象作为第一个参数传递给对象。 “,并且还说”说1. ^姓名“与“相同”“说1.HOW.name(1);” – timotimo

+0

这是一个我现在看得更清楚的例子,但缺少[方法文档](http://doc.perl6.org/routine/methods#role_Metamodel::MethodContainer)。它注意到它检查了一个类,它确实显示了一个$ obj参数,但我期望它是ClassHOW对象(我预计它已经知道是谁制作的)。 –

相关问题