除了在其中声明了签名的块之外,所有块均具有相同的标识值,并声称无论出现在何处都在第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;
}
Run Code Online (Sandbox Code Playgroud)
首先:.say它不是给你的身份价值,因为调用.gist给定的表达方法。对于身份值,您需要调用.WHICH方法。幸运的是,该Block.gist方法确实将身份值包括在其字符串化中。但这并不能保证所有对象都是如此。
您在这里看到的是正在使用的静态优化器:由于该块内什么都没有发生,因此可以将其丢弃。在一种不同的情况下(您指定了备用签名),它也有所不同。如果使用--optimize=0或运行此脚本--optimize=1,则所有块将具有不同的标识值。
我想您可以称其为提及&?BLOCK不会抑制静态优化器使范围变平的问题。另一方面,您也可以将其称为DIHWIDT(医生,我这样做时会受伤)。所以不要那样做:-)
更新:是不同的签名才有所作为。丹尼尔·米塔++