More on the proto keyword in Perl 6

在深入研究 EVAL 子例程的细节之前,我们必须揭示一些关于 protos 原型和多重分派的更多信息。检查以下程序:

proto subf($x) {

say"proto f($x)";

}

multi subf($x) {

say"f($x)"

}

multi subf(Int$x) {

say"f(Int $x)"

}

multi subf(Str$x) {

say"f(Str $x)"

}

f(2);

f('2');

f(3);

f('3');

这里有三个 multi 函数和一个用 proto 关键字声明的函数。早些时候,我们只看到了函数体为空的原型函数,如:

proto subf($x) {*}

但这不是必需的。正如我们在示例中所看到的,该函数可以承载正常的函数体:

proto subf($x) {

say"proto f($x)";

}

运行这个程序:

protof(2)

protof(2)

protof(3)

protof(3)

所有的调用都被 proto-候选者抓住了。现在,更新它并返回一些专用值的 块;

proto subf($x) {

if$x.Streq'3'{

return{*}

}

say"proto f($x)";

}

检查触发其最后两个函数调用的块

f(3);

f('3');

在这些情况下,proto-函数返回 ,这使 Perl 6 尝试其他候选者。由于对于整数和字符串参数我们有足够多的候选者,编译器可以轻松地选择其中之一:

protof(2)

protof(2)

f(Int3)

f(Str3)

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180226G1631T00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券