提问者:小点点

有没有办法检测某些东西是否不可变?


在Raku中,标量可能是不可变的,也可能是实际变量:

 my $a := 6;  # constant
 my $b  = 6;  # variable

有没有一种编程方法来检查标量是否不可变,而不仅仅是尝试更改它并查看它是否有效?


共2个答案

匿名用户

首先,稍微更正一下术语(不是挑剔,只是因为这个领域有点棘手,准确使用我们的术语会有所帮助)。

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