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

确定是否设置了Raku中的变量,raku,Raku,我有意避免使用术语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 typ

我有意避免使用术语
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
我们如何从
$abc
(值设置为
Str
)伪装
$bar
(无值设置,键入为
Str

假设
$bar.WHICH==abc.WHICH
,但是
$bar.VAR.WHICH!==$abc.VAR.WHICH
,以及像
.defined
这样的方法将为每个返回false,有没有快速简便的方法来确定是否存在一个设定值


我想可以对照默认值检查它,但是没有办法区分未设置的值和在代码中设置的值。

my Str$bar
my$bar=Str
导致相同的结果,两者都是Str类型,但没有确定的值
Str
是类型对象,而不是值


.defined
将返回
True
如果您给
$bar
一个确定的值,例如
“Str”
(请注意围绕裸字的引号)。

您可以尝试为变量指定一个默认值,而不是保持它未定义:

 my Str $bar is default("");
$bar
只有在分配了该值类型时才会是
Str
;如果通过赋值
Nil
删除了它的值,它将再次默认为空字符串。事实上,变量的默认值是其类型对象,因此:

my Str $foo;
my $bar = Str;
say $foo eqv $bar

事实上,将返回True。

我认为这两个值是相同的,但容器具有不同的属性

试一试


变量总是设置为某种值

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

my$abc;
比如$abc.VAR.default.raku;
#任何
my Int$def=42;
比如$def.VAR.default.raku;
#Int
my$ghi为默认值(42)=2;
比如$ghi.VAR.default.raku;
# 42

你所要求的并不是Raku真正支持的东西

不过,你可能会伪造一些接近的东西。
(每个
Mu.new
实例都是唯一的。)

sub未设置(Mu$为原始值){
$\uu0.self=:=$\u0.VAR.default
}
我的$abc为默认值(Mu.new);
my$def是默认值(Mu.new)=Any;
my$ghi为默认值(Mu.new)=Mu.new;
say未设置为$abc;#真的
say未设置为$def;#假的
say未设置$ghi;#假的
问题是分配
Nil
也会将其设置为默认值

$def=Nil;
say未设置为$def;#真的
查找默认值并分配它也是如此

$ghi=$ghi.VAR.default;
say未设置$ghi;#真的

我认为你不应该担心这些事情

如果在第一次分配变量时确实需要发生某些事情,可以执行以下操作:

my$abc:=Proxy.new(
#此提取只需要返回默认值
#在第一次分配时替换此代理
FETCH=>->${Any},
存储=>->$,$值{
#用新标量替换代理
$abc:=do{my$abc=$value};
说“第一次任务刚刚发生”
},
);
比如说$abc;
#任何
$abc=1;
#第一个任务刚刚发生
比如说$abc;
# 1
$abc=2;
比如说$abc;
# 2
do
块就在那里,因此
$abc.VAR.name
返回
$abc


否则,您可以只编写
$abc:=my$=$value

这是一般性问题还是实现问题?如果是后者,可能(ab)使用角色是一种选择

role isUnset {}; 
my Str $a = Str but isUnset; 
say $a ~~ isUnset; 

# meanwile
$a = 'set'; 
# ...
$a = Str;

# and then
say $a ~~ isUnset; # Now False

“结果是一样的”:虽然不是真的<代码>我的Str$bar$bar=3错误,因为
$bar
被键入为
Str
,但
my$bar=Str$bar=3
没有,因为
$bar
不是typedRight,所以我们如何确定是否已获得默认值或是否已为其分配了默认值?或者这是不可能的?@user0721090601我真的不这么认为。好吧,“总是设置为某个值”可能是OP-in的一些混淆之处,这使得jnthn的推理为什么
(Type:U)
没有gist方法那么好。我想知道在文档中是否有办法解决这个问题,我根本不考虑这种滥用。
角色
的一个重要(迄今为止很少使用)角色是作为mixin,其显著限制是mixin可能无法在接收mixin的对象的突变中存活,而mixin的一个重要(迄今为止很少使用)角色是附加元数据。如果角色混合到类型对象中,那么如果对象发生变化,则混合将保证丢失。在我看来,这似乎是对
角色的完美使用,它为OP提供了一个完美的简单解决方案。
ok 1 - The values are identical
ok 2 - The object is-a 'Str'
ok 3 - The object is-a 'Str'
ok 4 - The object is-a 'Mu'
ok 5 - The container $bar is not of Str
ok 6 - The object is-a 'Str'
1..6
role isUnset {}; 
my Str $a = Str but isUnset; 
say $a ~~ isUnset; 

# meanwile
$a = 'set'; 
# ...
$a = Str;

# and then
say $a ~~ isUnset; # Now False