在Raku中,标量可能是不可变的,也可能是实际变量:
my $a := 6; # constant
my $b = 6; # variable
有没有一种编程方法来检查标量是否不可变,而不仅仅是尝试更改它并查看它是否有效?
首先,稍微更正一下术语(不是挑剔,只是因为这个领域有点棘手,准确使用我们的术语会有所帮助)。
说my$a:=6
是一个常量并不完全正确;该表达式将$a
绑定到值6
,这会阻止您为$a分配不同的值(使用=
运算符)。但是,您仍然可以将一个新值重新绑定到$a
(使用:=
运算符)。这意味着$a
在某种意义上仍然可以发生突变——或者至少可以指向新的东西。对于真正常量的$a
,您应该使用常量$a
或将$a
更改为无符号变量(my\a=6
)。
现在来回答您的问题:要确定$a
是否绑定或分配给一个值,您可以使用$a. VAR.What
。如果$a
被分配了一个值,这将返回容器的类型,(标量)
;如果它被绑定,那么它将返回绑定值的类型。
据我所知,没有办法区分绑定到值的$a
和绑定为常量的之间的区别,尽管我很乐意在这方面出错。
下面的代码说明了我刚才所说的:
my $a = 1;
say $a.VAR.WHAT; # OUTPUT: «(Scalar)»
$a = 2;
say $a; # OUTPUT: «2»
my $b := 1;
say $b.VAR.WHAT;# OUTPUT: «(Int)»
$b := 2;
say $b; # OUTPUT: «2»
constant $c = 1;
say $c.VAR.WHAT; # OUTPUT: «(Int)»
# $c := 2; ILLEGAL
say $c; # OUTPUT: «1»
另一种方式,使用多重调度:
my $a := 6; # constant
my $b = 6; # variable
multi sub mutable($ is rw) { True }
multi sub mutable($) { False }
say mutable($a); # False
say mutable($b); # True
say mutable(42); # False