为什么空的乐形阵列是真实的?
看到这里,我有点惊讶:
> say my @i.so
False
> say my @i[3].so
True
谁能解释一下,为什么在乐曲中,空数组是假的,而空形数组是真?
回答
如果描述“空”指的是“没有元素”,那么就没有固定大小(又名“形状”)的空数组这样的东西:
say my @unshaped-array; # []
say @unshaped-array.shape; # (*) ("whatever" shape, or "unshaped")
say @unshaped-array.elems; # 0
say @unshaped-array.so; # False
say @unshaped-array[0,1,2]:exists; # (False False False)
say @unshaped-array[0,1,2]:delete; # ((Any) (Any) (Any))
say @unshaped-array[0,1,2]:exists; # (False False False)
say @unshaped-array; # []
say @unshaped-array = [Any,Any,Any]; # [(Any) (Any) (Any)]
say @unshaped-array.elems; # 3
say @unshaped-array.so; # True
say @unshaped-array[0,1,2]:exists; # (True True True)
say @unshaped-array[0,1,2]:delete; # ((Any) (Any) (Any))
say @unshaped-array[0,1,2]:exists; # (False False False)
say @unshaped-array; # []
say my @shaped-array[3]; # [(Any) (Any) (Any)]
say @shaped-array.shape; # (3)
say @shaped-array.elems; # 3
say @shaped-array.so; # True
say @shaped-array[0,1,2]:exists; # (False False False)
say @shaped-array[0,1,2]:delete; # (Nil Nil Nil)
say @shaped-array[0,1,2]:exists; # (False False False)
say @shaped-array; # [(Any) (Any) (Any)]
say @shaped-array = [42]; # [42 (Any) (Any)]
say @shaped-array.elems; # 3
say @shaped-array.so; # True
say @shaped-array[0,1,2]:exists; # (True False False)
say @shaped-array[0,1,2]:delete; # (42 Nil Nil)
say @shaped-array[0,1,2]:exists; # (False False False)
say @shaped-array = [Nil]; # [(Any) (Any) (Any)]
# Just because I named the array "shaped", doesn't mean its shape is fixed:
say @shaped-array := [Nil]; # [(Any)]
say @shaped-array.shape; # (*) ("whatever" shape, or "unshaped")
say @shaped-array := []; # []
say @shaped-array.elems; # 0
say @shaped-array.so; # False
my @i[0]; # Illegal ...
我不知道目前是否有一种方法可以声明一个永久绑定到固定形状数组的变量。