在签名文字中§

有关 强制转换类型,请参阅主要文档 上下文

要接受一种类型但自动将其强制转换为另一种类型,请使用接受的类型作为目标类型的一个参数。如果接受的类型是 Any,则可以省略它。

sub f(Int(Str$want-intStr() $want-str{
    say $want-int.^name ~ ' ' ~ $want-str.^name
}
f '10'10;
# OUTPUT: «Int Str␤» 
 
sub foo(Date(Str$d{ say $d.^namesay $d };
foo "2016-12-01";
# OUTPUT: «Date␤2016-12-01␤»

如果存在强制转换类型,则通过调用带有强制转换类型名称的方法来执行强制转换。在此示例中,我们正在 Str 类上调用内置方法 Date。该方法假定返回正确的类型,目前不会对结果执行其他检查。

强制转换也可以在返回类型上执行

sub square-str (Int $x --> Str(Int)) {
    $x²
}
 
for 2,4*²  … 256 -> $a {
    say $a"² is "square-str$a ).chars" figures long";
}
 
# OUTPUT: «2² is 1 figures long␤ 
#          4² is 2 figures long␤ 
#          16² is 3 figures long␤ 
#          256² is 5 figures long␤» 

在此示例中,将返回类型强制转换为 Str 允许我们直接应用字符串方法,例如字符数。

注意:相应的方法必须在参数上可用,因此在尝试强制转换自定义类型时要小心。

class Foo { }
 
sub bar(Foo(Int$x{ say $x }
 
bar(3);
# OUTPUT: «Impossible coercion from 'Int' into 'Foo': no acceptable coercion method found␤»