Почему Duration.new работает с Int, а не с Rat?

9

Для Длительности, почему я должен принуждать Крысу к Реалу вручную, но не Инт?

Это версия Rakudo 2020.01, основанная на версии 2020.01.1 MoarVM, реализующей 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
p6steve
источник

Ответы:

10

Это ошибка. Что было исправлено с помощью https://github.com/rakudo/rakudo/commit/f70d95e299 .

Причина, по которой он действовал иначе, Ratчем для любого другого типа, заключается в том, что Ratдело было оптимизировано таким образом, чтобы не приходилось выполнять какое-либо принуждение, и, следовательно, не нужно проверять результат принуждения. В этом случае значение было помещено непосредственно в новый Durationобъект. Однако, это было сделано без деконтейнерства, поэтому Durationобъект фактически ссылался на переменную $xиз вашего примера. В целом это нормально, но .gistлогика каким-то образом создала бесконечный цикл, пытаясь создать представление из- Durationза этой самореференции. Должен признать, я действительно не изучал, где это точно вошло в петлю.

В любом случае, убедившись, что значение внутри Durationобъекта обнуляется , проблема исчезает, так как она больше не может ссылаться на себя.

Элизабет Маттийсен
источник
1
ага - спасибо! Обычно с raku я нахожу ошибки мои, а не компилятор!
p6steve
Самостоятельный вопрос!
SS Anne