Đơn giản, chỉ cần sử dụng our
phạm vi mặc định mà không có xung quanhunit
bất cứ điều gì .
unit
chỉ bổ sung để bạn sẽ không phải xung quanh một tập tin toàn với {
và }
khi có chỉ có một module
, package
, class
, role
, hoặc sub
trong file.
Bạn không phải luôn luôn sử dụng nó.
Trong thực tế, bạn không bao giờ phải sử dụng nó.
Nếu bạn muốn, thêm một khai báo chuyển tiếp mà không cần tham số hóa.
Một đặc điểm được thêm vào nó thường sẽ áp dụng cho tất cả các vai trò có cùng tên.
lib/Foo/Bar.rakumod
:
use v6.d;
role Foo::Bar {…} # is export would be added here
role Foo::Bar[Int:D] {
method is-int(::?CLASS:_: --> True) { }
method is-str(::?CLASS:_: --> False) { }
}
role Foo::Bar[Str:D] {
method is-int(::?CLASS:_: --> False) { }
method is-str(::?CLASS:_: --> True) { }
}
Sau đó, khi bạn sử dụng nó, nó sẽ tự động được tải theo cách mà nó có thể truy cập bằng tên đủ điều kiện.
{
use lib <lib>; # only needed because it is not installed
use Foo::Bar;
say Foo::Bar[ 1].is-int; # True
say Foo::Bar[''].is-str; # True
say Foo::Bar.^name; # Foo::Bar
}
say Foo::Bar.^name; # error: Could not find symbol 'Bar' in 'Foo'
Trong trường hợp này, bạn có thể đặt nó bên trong một câu lệnh mô-đun để bạn không cần phải viết Foo::
thường xuyên như vậy.
lib/Foo/Bar.rakumod
:
use v6.d;
unit module Foo;
role Bar {…}
role Bar[Int:D] {
method is-int(::?CLASS:_: --> True) { }
method is-str(::?CLASS:_: --> False) { }
}
role Bar[Str:D] {
method is-int(::?CLASS:_: --> False) { }
method is-str(::?CLASS:_: --> True) { }
}
Vai trò vẫn có thể truy cập như Foo::Bar
.
Tôi sẽ không ngạc nhiên nếu điều này dẫn đến mã chính xác như ví dụ trước.
Lý do duy nhất để thêm is export
là nếu bạn muốn nó được xuất ra Bar
thay vì Foo::Bar
. Điều này áp dụng cho cả hai ví dụ trên.
Tôi đoán là bạn nghĩ rằng bạn luôn luôn cần phải sử dụng is export
. Trong nhiều trường hợp bạn thực sự không.
unit module Foo::Bar; # default `our` scoped
our sub baz ( --> 'hello world'){}
use Foo::Bar;
say Foo::Bar::baz(); # hello world
# this works because it was declared as `our`
Nếu bạn muốn có thể chỉ sử dụng baz()
trong khi có nó bên trong phạm vi của mô-đun, thì và chỉ sau đó bạn mới cần xuất nó.
unit module Foo::Bar;
our sub baz ( --> 'hello world') is export {}
use Foo::Bar;
say Foo::Bar::baz(); # hello world
# available because of `is export`
say baz(); # hello world
Lưu ý rằng tôi vẫn tuyên bố như our
vậy nếu ai đó không muốn bạn xuất nó, họ vẫn có thể truy cập được.
use Foo::Bar ();
# say baz(); # baz used at line 1. Did you mean 'bag'?
say Foo::Bar::baz(); # hello world
Toàn bộ mục đích is export
là để loại bỏ nhu cầu sử dụng tên đủ điều kiện cho các chức năng. Rằng nó cũng hoạt động cho những thứ như vai trò là một lợi ích phụ.
our
khai báo có phạm vi trong các mô-đun mà không có cácunit
khai báo có phạm vi đã trở thành toàn cầu vì một số lý do. Tôi đã đề cập đến hành vi nàyis export
bởi vì tôi cho rằng đó là cách đầu tiên mọi người có thể cố gắng xuất một cái gì đó như thế này.