gpt4 book ai didi

raku - 确定是否设置了 Raku 中的变量

转载 作者:行者123 更新时间:2023-12-03 14:36:13 28 4
gpt4 key购买 nike

我故意避免使用术语 defined因为一个变量很可能有一个定义的值,但 .defined方法将返回 false(例如,失败)。

有什么方法可以确定变量是否已为其设置了值?

my $foo;
say $foo; # (Any), its type object, no value assigned
my Str $bar;
say $bar; # (Str), its type object, no value assigned
my $abc = Str;
say $abc; # (Str), the type object we assigned to $abc

我们如何区分 $bar (未设置值,输入为 Str )来自 $abc (值设置为 Str )?

鉴于 $bar.WHICH == $abc.WHICH ,但是 $bar.VAR.WHICH !== $abc.VAR.WHICH ,以及类似 .defined 的方法将为每个返回false,是否有任何快速简便的方法来确定存在一个设定值?

我认为它可以根据默认值进行检查,但是没有办法区分由于未设置和在代码中设置的值。

最佳答案

变量总是被设置为某种值。

如果您不将其设置为值,则会为您选择一个值。
具体来说,它将被设置为默认值。
(如果您不选择默认值,它将被设置为类型对象。)

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 .

关于raku - 确定是否设置了 Raku 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61884940/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com