Perl 6 中的 HOW 方法

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 返回一个列表, 通过对列表中的每个元素调用 .gist 方法, 得到一个人类友好的形式。

但是 ^methods 中的 ^ 暗含了 .HOW 方法:

我想下面这段代码本该有效的, 但是没有:

my $object = 'Camelia';
my @object_objects = $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...

通过 . 调用的常规方法把点号左边的调用者作为第一个参数隐式地传递给该方法。通过 .^ 调用的元方法传递了两个参数:作为调用者的元对象(meta-object)和作为第一个位置参数的实例:

举个例子:

$obj.^can('sqrt')

就是下面这段代码的语法糖:

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

在你的例子中, 你应该写作:

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

:D 和 :D: 之间的区别


在一段定义 shift 子例程的Perl 6 代码里:

multi sub    shift(Array:D)
multi method shift(Array:D:)

我知道 :D 意味着 Arraydefined (有定义的)而非 Anynil, 但是 :D: 是什么意思呢? 文档中真的很难找到。

D后面的冒号表示方法的调用者作为第一个参数被隐式地传入进来。如果你想在签名中使用显式的参数(例如给它添加一个诸如 :D 的类型笑脸或者给它一个更具描述性的名字), 你需要使用 : 而非 , 以把它和剩余的参数列表分割开。这甚至在空列表时也是必要的, 所以这能消除含有常规位置参数的签名中的歧义。

更多信息, 请查看Invocant_parameters

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 标题: Rakudo and NQP Internals子标题: The guts tormented imple...
    焉知非鱼阅读 5,293评论 1 3
  • 2009 有用的和有意思的循环 让我们来看一个基本的例子. 这是一个最简单清晰的语法的例子.在这并没有使用括号来包...
    焉知非鱼阅读 3,717评论 0 0
  • 从匹配中返回值 Match 对象 成功的匹配总是返回一个 Match 对象, 这个对象通常也被放进 $/ 中, (...
    焉知非鱼阅读 5,826评论 0 1
  • 捕获 签名不仅仅是语法,它们是含有一列参数对象的 first-class 对象 。同样地,有一种含有参数集的数据...
    焉知非鱼阅读 3,808评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,698评论 18 399

友情链接更多精彩内容