变量总是被设置为某种值。
如果您不将其设置为某个值,则会为您选择一个值。
具体来说,它将被设置为默认值。
(如果你不选择默认值,它将被设置为类型对象。)
my $abc;
say $abc.VAR.default.raku;
# Any
my Int $def = 42;
say $def.VAR.default.raku;
# Int
my $ghi is default(42) = 2;
say $ghi.VAR.default.raku;
# 42
你所要求的并不是 Raku 真正支持的东西。
不过,您可能会伪造一些接近的东西。
(Mu.new 的每个实例都是唯一的。)
sub is-not-set ( Mu $_ is raw ) {
$_.self =:= $_.VAR.default
}
my $abc is default(Mu.new);
my $def is default(Mu.new) = Any;
my $ghi is default(Mu.new) = Mu.new;
say is-not-set $abc; # True
say is-not-set $def; # False
say is-not-set $ghi; # False
问题是分配Nil 也会将其设置为默认值。
$def = Nil;
say is-not-set $def; # True
将查找默认值并分配它。
$ghi = $ghi.VAR.default;
say is-not-set $ghi; # True
我认为你不应该担心这些事情。
如果您真的需要在第一次分配给变量时发生某些事情,您可以执行以下操作:
my $abc := Proxy.new(
# this FETCH only needs to return the default
# as this Proxy gets replaced upon the first assignment
FETCH => -> $ { Any },
STORE => -> $, $value {
# replace the Proxy with a new Scalar
$abc := do { my $abc = $value };
say 'first assignment just happened'
},
);
say $abc;
# Any
$abc = 1;
# first assignment just happened
say $abc;
# 1
$abc = 2;
say $abc;
# 2
do 块就在那里,所以$abc.VAR.name 返回$abc。
否则你可以写$abc := my $ = $value。