首页 > 解决方案 > 为什么默认的 Raku if/while/loop/when 块都具有相同的标识值 (.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;
}

标签: rakuroutines

解决方案


首先:.say你标识值,因为它调用.gist给定表达式的方法。对于标识值,您需要调用.WHICH方法。幸运的是,该Block.gist方法确实在其字符串化中包含了标识值。但不能保证所有对象都是如此。

你在那里看到的是静态优化器在工作:因为块内没有发生任何事情,它可以被丢弃。在它不同的一种情况下(您指定了备用签名),它不同的。如果您使用--optimize=0or运行此脚本--optimize=1,则所有块具有不同的标识值。

我想您可以将其称为一个问题,即提及&?BLOCK不会抑制静态优化器使范围变平。另一方面,您也可以将其称为 DIHWIDT(医生,我这样做时很痛)。所以不要那样做:-)

更新:是不同的签名造成了差异。丹尼尔·米塔++


推荐阅读