Tại sao Weather.new hoạt động với Int mà không phải là Rat?


9

Trong một khoảng thời gian, tại sao tôi cần phải ép một con chuột thành Real bằng tay, nhưng không phải là một Int?

Đây là phiên bản Rakudo 2020.01 được xây dựng trên phiên bản MoarVM 2020.01.1 thực hiện Perl 6.d. Trên 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

Câu trả lời:


10

Đây là một lỗi. Điều này đã được sửa với https://github.com/rakudo/rakudo/commit/f70d95e299 .

Lý do nó hành động khác Ratvới bất kỳ loại nào khác, là Rattrường hợp được tối ưu hóa để không phải thực hiện bất kỳ sự ép buộc nào, và do đó không cần thiết phải kiểm tra kết quả của sự ép buộc. Trong trường hợp đó, giá trị được đưa trực tiếp vào Durationđối tượng mới . Tuy nhiên, nó đã làm như vậy mà không khử container, vì vậy Durationđối tượng thực sự sẽ tham chiếu biến $xtừ ví dụ của bạn. Điều này nói chung là ổn, nhưng .gistlogic bằng cách nào đó đã tạo ra một vòng lặp vô hạn cố gắng tạo ra một đại diện cho Durationvì tự tham chiếu này. Phải thừa nhận tôi đã không thực sự nhìn vào nơi nó chính xác đi vào một vòng lặp.

Dù sao, bằng cách đảm bảo giá trị được khử nhiễm bên trong Durationđối tượng, vấn đề sẽ biến mất khi đó nó không thể tự tham chiếu được nữa.


1
aha - cảm ơn! Thông thường với raku tôi thấy các lỗi là của tôi chứ không phải trình biên dịch!
p6steve

Câu hỏi tự tham khảo!
SS Anne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.