Перш за все: .say
це НЕ дасть вам значення ідентифікатора, тому що викликає .gist
метод на даному вираженні. Для значення ідентичності потрібно викликати .WHICH
метод. На щастя, Block.gist
метод так і є включає значення ідентичності в його строфікацію. Але це не гарантовано стосується всіх об'єктів.
Те, що ви там бачите, - це статичний оптимізатор на роботі: оскільки всередині блоку нічого не відбувається, його можна відкинути. В одному випадку , коли він відрізняється (де ви вказали додаткову підпис), то є різна. Якщо ви запускаєте цей скрипт з --optimize=0
або --optimize=1
, то всі блоки матимуть різні значення ідентичності.
Я думаю, ви можете назвати це проблемою, що згадування &?BLOCK
не перешкоджає статичному оптимізатору розгладжувати область. З іншого боку, ви можете також назвати це випадком DIHWIDT (Лікар, боляче, коли я це роблю). Тож не робіть цього тоді :-)
ОНОВЛЕННЯ: саме підпис змінив свою різницю. Даніель Міта ++