Простой, просто используйте область по умолчанию our
без окружения unit
что-либо.
unit
был добавлен только для того, чтобы вам не пришлось окружать весь файл {
и }
когда в файле был только один module
, package
, class
, role
или sub
.
Вам не всегда нужно его использовать.
На самом деле у вас никогда не будет для его использования.
Если вы хотите, добавьте предварительное объявление без параметризации.
Добавленная к нему черта обычно применяется ко всем ролям. с тем же именем.
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) { }
}
Затем, когда вы используете его, он автоматически загружается таким образом, что он доступен по полному имени.
{
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'
В этом случае вы можете поместить его в оператор модуля, чтобы вам не приходилось так часто писать Foo::
.
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) { }
}
Роль по-прежнему доступна как Foo::Bar
.
Я не удивлюсь, если это приведет к тому же коду, что и в предыдущем примере.
* 10 40 * Единственная причина для добавления
is export
состоит в том, что вы хотите экспортировать его как
Bar
вместо
Foo::Bar
. Это относится к обоим приведенным выше примерам.
Полагаю, вы думали, что вам всегда нужно было использовать is export
. Во многих случаях вы действительно этого не сделаете.
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`
Если вы хотите иметь возможность просто использовать baz()
, находясь внутри области действия модуля, тогда и только затем вам нужно его экспортировать.
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
Обратите внимание, что я все еще объявил его как our
, так что если кто-то не хочет, чтобы вы его экспортировали, он все еще был доступен к ним.
use Foo::Bar ();
# say baz(); # baz used at line 1. Did you mean 'bag'?
say Foo::Bar::baz(); # hello world
Вся цель is export
состоит в том, чтобы устранить необходимость использования полностью определенных имен для функций. То, что это также работает для таких вещей, как роли, является дополнительным преимуществом.