raku - 有没有办法检测某些东西是否不可变?
问题描述
在 Raku 中,标量可能是不可变的,也可能是实际变量:
my $a := 6; # constant
my $b = 6; # variable
是否有一种编程方式来检查标量是否不可变,而不仅仅是尝试更改它并查看它是否有效?
解决方案
首先,稍微修正一下术语(不要吹毛求疵,只是因为这个领域有点棘手,并且准确地使用我们的术语会有所帮助)。
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»
推荐阅读
- excel-formula - Excel:如何将“答案”行移动到“问题”列下?
- c# - 连接两个保存为 blob 的 PDF 文件
- sql - 通过忽略空/空值在 Sqlite 中查找 AVG
- node.js - 如何使用状态参数使 OAuth 流安全
- python - 如何同时从多个 python 线程正确写入日志文件?
- python - 在迭代期间交换列表元素
- node.js - 无法使用strapi连接到mongodb
- node.js - 直接从 Google Cloud Storage 提供 html 并解析相关链接
- azure - 在 Azure Cache for Redis(基本层)中还原 dump.rdb 文件
- css - 为什么我在引导程序中的轮播组件中看不到上一个和下一个箭头?