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

前端之家收集整理的这篇文章主要介绍了metaclass – 为什么我不能在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的列表,以获得该方法的人类感知形式.

但是,^ in ^方法是隐含的.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);

猜你在找的Perl相关文章