2017-08-21 12 views
6

Trong doc.perl6.org, tôi đã nhìn thấy nhiều phương pháp như thế này:Đại tràng thứ hai trong "Danh sách: D:" có nghĩa là gì trong Perl 6?

method sum(List:D: --> Numeric:D) 

tôi konw List:D là một loại Danh sách được xác định, nhưng những gì hiện đại tràng sau khi D nghĩa (ví dụ thứ hai trong List:D:)?

Tôi tìm thấy một số giải thích trong S12-objects:

= Invocants head2

Tuyên bố của invocant là không bắt buộc. Bạn luôn có thể truy cập vào trình kích hoạt hiện tại bằng cách sử dụng từ khóa self. ... Để đánh dấu một invocant rõ ràng, chỉ cần đặt một dấu hai chấm sau nó:

method doit ($x: $a, $b, $c) { ... } 

nhưng tôi không hiểu, nó hơi lạ ở cái nhìn đầu tiên.

+1

Xem thêm GitHub Perl6 doc issue [1121] (https://github.com/perl6/doc/issues/1121): Phương pháp tài liệu được kích hoạt. –

Trả lời

6

Bằng phương pháp mặc định có một invocant của self

Vì vậy, cả hai sẽ tương đương:

method foo (  $a){…} 
method foo (\self: $a){…} # generates warning 

Vì vậy, mở rộng ví dụ đầu tiên ra những gì nó là sắp xếp của viết tắt của

method sum(List:D \self: --> Numeric:D){…} # generates warning 

Về cơ bản bạn viết theo cách đó nếu bạn muốn chỉ định loại kẻ xâm lược (argumen đầu tiên t) với một phương pháp, nhưng chỉ muốn sử dụng self thay vì chỉ định một biến mới.


Lý do nó sử dụng : để chia ra các invocant từ phần còn lại của các thông số là để đơn giản hóa các trường hợp phổ biến mà bạn không xác định invocant, hoặc loại các invocant.

1

Khi bạn định nghĩa một phụ với một loại hạn chế cơ bản như thế này:

sub testB (Str $b) { say $b; } 

sau đó bạn có thể gọi nó với một ví dụ thực tế của các loại trong câu hỏi cũng như với các đối tượng kiểu riêng của mình:

> testB("woo") 
woo 
> testB(Str) 
(Str) 

Các: D là một loại hạn chế bổ sung, vì vậy bạn chỉ có thể vượt qua một "định nghĩa" Ví dụ:

sub testC (Str:D $c) { say $c; } 
> testB(Str) 
(Str) 
> testC("hoo") 
hoo 
> testC(Str) 
Parameter '$c' of routine 'testC' must be an object instance of type 'Str', not a type object of type 'Str'. Did you forget a '.new'? 
    in sub testC at <unknown file> line 1 
    in block <unit> at <unknown file> line 1 

Các chi tiết khác có thể được tìm thấy here

+1

Tôi tin rằng chenyf đã hỏi về đại tràng thứ hai trong định nghĩa loại, không phải là lần đầu tiên. Không phải 'Str: D', nhưng' Str: D: '. – piojo

+0

Đó cũng là suy nghĩ đầu tiên của tôi. Tôi đã cập nhật câu hỏi để làm cho nó rõ ràng hơn. –

+0

cảm ơn Christopher Bottoms – chenyf

Các vấn đề liên quan