Чому Duration.new працює з Int, а не Rat?


9

На час, чому мені потрібно вручну примушувати Щура до Реала, але не Інт?

Це Rakudo версія 2020.01, побудована на версії MoarVM 2020.01.1, що реалізує Perl 6.d. На OSX.

say $v.WHAT; #(Int)
$v = Duration.new( $v );
say $v;     #20 

my $w = 20.0;
say $w.WHAT; #(Rat)
$w = Duration.new( $w.Real );
say $w;     #20 

my $x = 20.0;
say $x.WHAT; #(Rat)
$x = Duration.new( $x );
say $x;     #hangs

Відповіді:


10

Це помилка. Що було виправлено за допомогою https://github.com/rakudo/rakudo/commit/f70d95e299 .

Причина, з якої вона діяла інакше, Ratніж для будь-якого іншого типу, полягає в тому, що Ratсправа була оптимізована таким чином, що не потрібно робити жодного примусу, і, таким чином, не потрібно перевіряти результат примусу. У цьому випадку значення було поставлено безпосередньо в новий Durationоб’єкт. Однак це було зроблено без дезактивації, тому Durationоб’єкт насправді буде посилатися на змінну $xз вашого прикладу. Це взагалі добре, але .gistлогіка якось створила нескінченний цикл, який намагався створити уявлення про те, Durationчерез це самонаправлення. Потрібно визнати, я не дуже заглянув, де саме потрапив у цикл.

У будь-якому випадку, переконуючись, що значення стає деконцентризованим всередині Durationоб'єкта, проблема відходить, тому що вона вже не може самостійно посилатися.


1
ага - спасибі! Зазвичай з raku я знаходжу, що мої помилки, а не компілятор!
p6steve

Питання про самореференцію!
СС Енн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.