Làm cách nào để phân lớp IO :: Xử lý? Ví dụ, tôi muốn để có thể "autoflush" bằng cách gọi tuôn ra sau mỗi say
:Làm thế nào tôi có thể phân lớp IO của Perl 6 :: Xử lý?
class MyIO is IO::Handle {
multi method say(MyIO:D: **@text --> True) {
nextsame;
$*ERR.say: "Flushing\n";
self.flush;
}
};
Metamodel::Primitives.rebless: $*OUT, MyIO;
put $*OUT.^name;
$*OUT.say: "This is standard out";
Nhưng, dường như MyIO không bao giờ được gọi.
Tôi hình dung rằng tôi có thể bọc nói để tạo hiệu ứng, nhưng tôi quan tâm hơn đến kỹ thuật của các lớp con đơn giản để ghi đè lên một số hành vi. Nhưng, có nói rằng, nếu có một cách Perly 6 hơn là thiết kế dự định cho mọi người sử dụng.
Vì vậy, một số câu hỏi:
Liệu Perl 6 actaully chăm sóc mà tôi reblessed nó? Làm cách nào để tìm kiếm các tên phương thức có thể bỏ qua?
Các lớp dựng sẵn có đặc biệt chống lại các kỹ thuật OO tiêu chuẩn do phép thuật và NQPness của chúng không?
Có phải Perl 6 không khuyến khích mức độ khó xử lý thấp, chẳng hạn như mở lại $ * OUT trên bộ mô tả tệp? (Như trong Does changing Perl 6's $*OUT change standard output for child processes?)
Một chút về tương lai trước: ngôn ngữ 6.d sẽ có các phương pháp cụ thể trên IO :: Xử lý bạn có thể ghi đè trong các lớp con của bạn để ảnh hưởng * tất cả * ghi/đọc. Các tên làm việc hiện tại là '.write-internal',' .read-internal' và '.eof-internal' mặc dù tên chưa được bikeshedded và specced. Một bản xem trước của việc sử dụng chúng có thể được nhìn thấy trong [impl hiện tại. của IO :: Pipe] (https: // github.com/rakudo/rakudo/blob/58900e7ba8ad31d905968d950bd9066a239320f5/src/core/IO/Pipe.pm # L25-L51) –
Cũng lưu ý rằng ['nextsame' không trả lại cho người gọi] (https://rakudo.party/ post/Perl6-Nhưng-Heres-My-Dispatch-So-Callwith-Có lẽ). –
nếu bạn chạy '.perl.say với $ * OUT.^Find_method (" say "). Ứng cử viên' bạn có thể thấy rằng ứng cử viên của bạn thực sự xuất hiện. nó không đủ cụ thể, tức là các ứng cử viên '$ text' thắng ứng cử viên' ** @ args' của bạn. – timotimo