Quá tải toán tử Raku


8

Sử dụng mã sau:

use v6d;

# sub circumfix:<α ω>( @a ) {
#     @a[0] >= @a[1] & @a[0] <= @a[2];
# };

sub circumfix:<α ω>( $a, $b, $c ) {
    $a >= $b & $a <= $c;
};

if (α <5 0 10> ω) {
    say 'Truthy';
}
else {
    say 'Falsey';
}

Kết quả trong:

(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Too few positionals passed; expected 3 arguments but got 1
  in sub circumfix:<α ω> at ./op.p6 line 7
  in block <unit> at ./op.p6 line 11

Trong khi chuyển đổi khối nhận xét cho kết quả định nghĩa khác trong:

(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Truthy

Phiên bản bị hỏng (có ba tham số) là phiên bản tôi muốn, ai đó có thể giải thích tại sao nó bị hỏng không?

Câu trả lời:


10

<5 0 10>nghĩa là xây dựng một List, một single List .

Một sự tương tự sẽ là một danh sách những việc cần làm, một danh sách việc cần làm. Có bao nhiêu thứ là một danh sách việc cần làm? Đó là 1 - một danh sách việc cần làm.

Do đó, bạn nhận được thông báo lỗi:

expected 3 arguments but got 1

Những gì bạn muốn là xác định rằng bạn muốn một giá trị được tạo thành từ một số giá trị. Đây là một cách để làm điều đó:

sub circumfix:<α ω>( ( $a, $b, $c ) ) ...

Các bổ sung xung quanh ()gây ra phá hủy .


1
Một cách khác có thể là sử dụng một chữ ký lắt léo (*@foo where .elems == 3)mà sau đó có thể hỗ trợ α $a, $b, $c ωhoặcα ($a, $b, $c) ω
user0721090601

@ user0721090601 Sub-sigs cũng hỗ trợ. Việc đưa sự phong phú chữ ký vào các nhóm con cung cấp cho trình biên dịch nhiều kiến ​​thức hơn một wheremệnh đề để bạn nhận được, ví dụ như một thông báo lỗi mặc định đẹp hơn và tốc độ gửi đi. Tôi thấy wherecác mệnh đề tốt nhất cho các điều kiện tùy ý mà một sig phụ không thể xử lý hoặc để xác định một thông báo lỗi hoàn toàn tùy chỉnh (ví dụ ( *@ where { .elems == 3 or die "nope" } )). Lưu ý rằng bạn có thể kết hợp các yếu tố sau: ( *@ where { .elems == 3 or die "nope" } ($a, $b, $c) )cung cấp cho bạn khả năng phá hủy thành các biến được đặt tên khi bạn nhận được (các) đối số đúng và thông báo lỗi tùy chỉnh khi bạn không.
raiph

1
++ nhiều thiết bị sẽ hoạt động để tránh nơi đó, nhưng tôi không nhận ra người ta có thể sử dụng cái ẩn danh để phá hủy trong khi cung cấp cho một nơi (ý tôi là, tôi cho rằng bạn không bao giờ có thể nhìn thấy một ví dụ và thực sự có thể đọc được)
user0721090601

Có với multis, tốt hơn nhiều so với đề xuất của tôi về việc lạm dụng một wheremệnh đề cho trường hợp sử dụng lỗi có thể được phân biệt bằng nhiều chữ ký mà không có wheremệnh đề. (Hồi tưởng lại, tôi thấy xấu hổ về sự mặc khải của tôi về bản năng hackier của mình khi chúng hoàn toàn không cần thiết và không phù hợp!) Anyhoo, có một upvote khác và cảm ơn vì đã cải thiện câu trả lời của chúng tôi bằng nhận xét của bạn. :)
raiph

7
D:\>6e "say <5 0 10>"
(5 0 10)

Đây không phải là ba đối số. Đây là danh sách gồm ba giá trị (loại IntStr) và do đó là một đối số duy nhất.

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.