Cách Perl 6 để nói sự khác biệt giữa một đối số và không có đối số trong một khối không có chữ ký rõ ràng là gì? Tôi không có bất kỳ thực tế sử dụng cho điều này, nhưng tôi tò mò.Đó là một đối số hoặc không có đối với một khối Perl 6?
Một khối không có chữ ký rõ ràng đặt giá trị vào $_
:
my &block := { put "The argument was $_" };
Chữ ký thực sự là ;; $_? is raw
. Đó là một đối số tùy chọn. Biến số @_
không được xác định trong khối vì không có chữ ký rõ ràng.
Có là không có đối số, nơi $_
sẽ được undefined:
&block(); # no argument
Nhưng cũng có một tình huống một đối số nơi $_
sẽ được định nghĩa. Một đối tượng loại luôn undefined:
&block(Int);
Nhưng, một $_
với không có gì ở trong đó thực sự là một Any (chứ không phải là, nói, Nil). Tôi không thể biết sự khác biệt giữa hai trường hợp sau đây:
&block();
&block(Any);
Dưới đây là một ví dụ nữa:
my $block := {
say "\t.perl is {$_.perl}";
if $_ ~~ Nil {
put "\tArgument is Nil"
}
elsif ! .defined and $_.^name eq 'Any' {
put "\tArgument is an Any type object"
}
elsif $_ ~~ Any {
put "\tArgument is {$_.^name} type object"
}
else {
put "\tArgument is $_";
}
};
put "No argument: "; $block();
put "Empty argument: "; $block(Empty);
put "Nil argument: "; $block(Nil);
put "Any argument: "; $block(Any);
put "Int argument: "; $block(Int);
Thông báo sự không tranh cãi và bất kỳ hình thức lập luận cho thấy những điều tương tự:
No argument:
.perl is Any
Argument is an Any type object
Empty argument:
.perl is Empty
Argument is Slip type object
Nil argument:
.perl is Nil
Argument is Nil
Any argument:
.perl is Any
Argument is an Any type object
Int argument:
.perl is Int
Argument is Int type object
Tôi biết tất cả điều đó. Tôi hỏi về trường hợp tôi đặt 'Any' vào đó. –
@briandfoy Nếu bạn cần thông tin này, không sử dụng tính năng được thiết kế để tạo sự khác biệt vô hình. –
Nó không phải là tôi cần nó. Tôi đang xem cách ngôn ngữ hoạt động và các ranh giới của nó để tôi có thể nói cho người khác biết họ sẽ không thể làm gì. –