Почему Duration.new работает с Int, а не с Rat? - PullRequest
9 голосов
/ 10 апреля 2020

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

Это версия 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

1 Ответ

10 голосов
/ 10 апреля 2020

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

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

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

...