Perl6 类型已经是 Maybe 类型。
只是 Perl6 的类型为 null,这与大多数其他具有 Maybe 类型的语言不同。
这是Maybe[Int] 变量:
my Int $a;
my Int:_ $a; # more explicit
这有一个明确的Int:
my Int:D $a = …; # must be assigned because the default is not “definite”
这包含一个空的Int:
my Int:U $a;
请注意Failure 是Nil 的子类型,因此即使指定了返回类型的子例程也可以返回它们。
(Nil 不像其他语言的 null 或 nil。)
sub foo ( --> Int:D ) { Bool.pick ?? 1 !! fail 'oops' }
my $foo = foo; # $foo contains the failure object
Nil 实际上是一种通用软故障。当分配给一个变量时,它只是将其重置为默认值。
my Int $foo = 1;
$foo = Nil;
say $foo.perl; # Int
my Int:D $bar is default(42) = 1;
$bar = Nil
say $bar.perl; # 42
典型的默认与类型相同。
my Int $foo;
say $foo.VAR.default.perl; # Int
一个特定的软故障是返回一个类型对象
sub foo ( --> Int ){
Bool.pick ?? 1 !! Int
}
这就是为什么我说Nil 是一个“通用”软故障。
通常,如果您要定义变量的类型,您希望它是该类型。因此,如果你的代码得到其他类型的东西,它应该立即抱怨。
有更好的方法来处理Failure。
sub foo(--> Int:D ) { rand < 0.5 ?? 1 !! fail 'oops' }
with foo() -> Int:D $foo {
… # use $foo here
} else -> $fail {
… # use $fail here
}
这是可行的,因为Failure 总是认为自己是未定义的。
您也可以将其与 when 一起使用
given foo() {
when Int:D -> Int:D $foo {
… # use $foo here
}
when Failure:D -> Failure:D $fail {
# a DEFINITE Failure value
# (`DEFINITE` is different than `defined`.)
}
default {
… # handle unexpected values (can be removed if not needed)
}
}
或者只是定义或运算符//,如果你不在乎它是什么类型的失败。
my Int:D $foo = foo() // 1;
您甚至可能想用它来将Failure 变成Nil。
my Int:D $foo is default(42) = foo() // Nil;
如果你真的想要一个可能失败的子集,我认为这应该可行:
sub Maybe-Failure ( Any:U ::Type ) {
anon subset :: of Any where Type | Failure
}
my constant Maybe-Int = Maybe-Failure(Int);
# note that the type has to be known at compile-time for this line:
my Maybe-Int $foo = foo;
它目前不起作用。
(请注意,您不应该处理Mu,除非您需要专门处理Any 类型之外的类型和值;例如Junction 和IterationEnd。)
其他可能也应该起作用的是:
my class Maybe-Failure {
method ^parameterize ( $, Any:U ::Type ) {
anon subset :: of Any where Type | Failure
}
}
my Maybe-Failure[Int] $foo;
这似乎与另一个失败的原因相同。
另一种方法是创建一个新类型的类,例如subset。
也就是说,subset 使用的 MOP 与 Perl6 中的其他类不同。