为什么默认的 Raku if/while/loop/when 块都具有相同的标识值 (.WHICH)?
Why do the default Raku if/while/loop/when blocks all have the same identity value (.WHICH)?
除了我声明签名的区块外,所有区块都具有相同的标识值,并且无论它们出现在哪里都声称在第 1 行声明。谁能解释一下为什么会这样?
say 「Let's look at some blocks…」;
if True {
&?BLOCK.say;
}
while True {
&?BLOCK.say;
last;
}
loop {
&?BLOCK.say;
last;
}
if True -> | {
「I'm different!」.say;
&?BLOCK.say;
}
when ?True {
&?BLOCK.say;
}
首先:.say
NOT 不会给你标识值,因为它会调用给定表达式的 .gist
方法。对于标识值,需要调用.WHICH
方法。幸运的是,Block.gist
方法 确实 在其字符串化中包含标识值。但并非保证所有对象都是如此。
你在那里看到的是静态优化器在工作:因为块内没有发生任何事情,所以它可以被丢弃。在一种不同的情况下(您指定了备用签名),它 是 不同的。如果您 运行 此脚本带有 --optimize=0
或 --optimize=1
,则所有块 将 具有不同的标识值。
我想您可以将其称为提及 &?BLOCK
不会阻止静态优化器展平范围的问题。另一方面,您也可以将此称为 DIHWIDT(医生,当我这样做时很痛)。所以不要那样做:-)
更新:造成差异的是不同的签名。丹尼尔米塔++
除了我声明签名的区块外,所有区块都具有相同的标识值,并且无论它们出现在哪里都声称在第 1 行声明。谁能解释一下为什么会这样?
say 「Let's look at some blocks…」;
if True {
&?BLOCK.say;
}
while True {
&?BLOCK.say;
last;
}
loop {
&?BLOCK.say;
last;
}
if True -> | {
「I'm different!」.say;
&?BLOCK.say;
}
when ?True {
&?BLOCK.say;
}
首先:.say
NOT 不会给你标识值,因为它会调用给定表达式的 .gist
方法。对于标识值,需要调用.WHICH
方法。幸运的是,Block.gist
方法 确实 在其字符串化中包含标识值。但并非保证所有对象都是如此。
你在那里看到的是静态优化器在工作:因为块内没有发生任何事情,所以它可以被丢弃。在一种不同的情况下(您指定了备用签名),它 是 不同的。如果您 运行 此脚本带有 --optimize=0
或 --optimize=1
,则所有块 将 具有不同的标识值。
我想您可以将其称为提及 &?BLOCK
不会阻止静态优化器展平范围的问题。另一方面,您也可以将此称为 DIHWIDT(医生,当我这样做时很痛)。所以不要那样做:-)
更新:造成差异的是不同的签名。丹尼尔米塔++