UInt 被定义为 Int 的子集

my subset UInt of Int where {not .defined or $_ >= 0};

因此,它不能被实例化或子类化;但是,这不会影响大多数正常使用。

一些关于其行为和用途的示例

say UInt ~~ Int# OUTPUT: «True␤» 
my UInt $u = 0xffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff# 64-bit unsigned value 
say $u.base(16); # OUTPUT: «FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF␤» (32 digits) 
++$u;
say $u.base(16); # OUTPUT: «100000000000000000000000000000000␤» (33 digits!) 
my Int $i = $u;
say $i.base(16); # same as above 
say $u.^name;    # OUTPUT: «Int␤» - UInt is a subset, so the type is still Int. 
say $i.^name;    # OUTPUT: «Int␤» 
# Difference in assignment 
my UInt $a = 5;  # nothing wrong 
my UInt $b = -5# Exception about failed type check 
my UInt $c = 0;
--$c;            # Exception again 
CATCH { default { put .^name''.Str } };
# OUTPUT: «X::TypeCheck::Assignment: Type check failed in assignment to $b; expected UInt but got Int (-5)␤» 
 
# Non-assignment operations are fine 
my UInt $d = 0;
say $d - 3;      # OUTPUT: «-3␤»

类型图§

UInt 的类型关系
raku-type-graph UInt UInt Any Any UInt->Any Mu Mu Any->Mu

展开上面的图表