为何Raku中constant声明无法进行变量插值?
Raku v6.d中constant变量引用普通变量的初始化问题
测试代码
use v6.d; my Str $foo = 'Hello'; my constant $BAR = "--$foo--"; say $BAR;
实际输出
Use of uninitialized value element of type Str in string context. Methods .^name, .raku, .gist, or .say can be used to stringify it to something meaningful. in block at deleteme.raku line 4 ----
预期输出
--Hello--
环境信息
[187] > $*DISTRO macos (12.6) [188] > $*KERNEL darwin [189] > $*RAKU Raku (6.d)
问题原因
Raku中的constant变量是编译时完成初始化的,而普通my变量的赋值是在运行时执行的。当编译constant $BAR的初始化表达式时,$foo还未被赋值,处于未初始化状态,因此触发未初始化变量警告,最终输出空分隔符----。无论用my还是our修饰符,都改变不了普通变量的赋值时机,因此问题表现一致。
解决方法
方法1:将普通变量赋值放到编译时(BEGIN块)
如果确实需要使用constant,可以把$foo的赋值放到BEGIN块中,让它在编译时完成初始化:
use v6.d; BEGIN my Str $foo = 'Hello'; my constant $BAR = "--$foo--"; say $BAR;
方法2:改用运行时只读变量
如果不需要严格的编译时常量,仅需一个只读的运行时变量,可以用readonly修饰符替代constant:
use v6.d; my Str $foo = 'Hello'; my readonly Str $BAR = "--$foo--"; say $BAR;
两种方法都能得到预期的--Hello--输出。
内容的提问来源于stack exchange,提问作者Jim Bollinger
相关产品推荐
相关产品推荐

