首页 > 解决方案 > 有没有办法检测某些东西是否不可变?

问题描述

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

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

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

标签: raku

解决方案


首先,稍微修正一下术语(不要吹毛求疵,只是因为这个领域有点棘手,并且准确地使用我们的术语会有所帮助)。

my $a := 6说这是一个常数是不对的;该表达式绑定 $a到 value 6,这会阻止您为 $a (使用运算符)分配=不同的值。但是,您仍然可以将新值重新绑定到$a(使用:=运算符)。这意味着$a从某种意义上说,它仍然可以发生变异——或者,至少,可以指向一些新的东西。对于真正的常量$a,您应该使用constant $a或更改$a为无符号变量 ( my \a = 6)。

现在来回答您的问题:要确定$a是绑定还是分配给一个值,您可以使用$a.VAR.WHAT. 如果$a被赋值,这将返回容器的类型,(Scalar); 如果它被绑定,那么它将返回绑定值的类型。

据我所知,没有办法区分$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»

推荐阅读