
106
|
第
5
章
Cannot convert string to number: base-10 number must
begin with valid digits ...
进入
Block
时会失败,它永远也不会到达(完成除法的)那个代码。如果要完成数
值操作,就应当只允许数字:
my $block := -> Numeric $b, Numeric $a { $a / $b };
put $block( 1, 2 );
put $block( 'Hamadryas', 'perlicus' );
第一个调用是可以的,而第二个调用试图使用
Str
,然后失败了:
2
Type check failed in binding to parameter '$b';
expected Numeric but got Str ("Hamadryas")
如果
Numeric
类型对你来说过宽,可以选择另一个类型:
my $block := -> Int $b, Int $a { $a / $b };
不过,这里还有一个问题。
Int
约束允许所有能智能匹配为
Int
的值。
Int
类型对象
也满足这个要求:
$block( Int, 3 ); # call still works
这会使它顺利通过参数的类型检查,但是完成除法时会失败。可以在类型后面增加
一个
:D
,这会限制它必须是已定义的值。类型对象总是未定义的:
my $block := -> Int:D $b, Int:D $a { $a / $b };
第
11
章中还会了解更多有关内容。 ...