Verwenden Sie einfach den Standardbereich our
ohne Umgebungsbedingungen unit
.
unit
nur wurde hinzugefügt , so dass Sie nicht mit einer ganzen Datei umgeben würden {
und }
wenn es nur einer module
, package
, class
, role
, oder sub
in der Datei.
Sie müssen es nicht immer verwenden.
In der Tat Sie nie haben , es zu benutzen.
Wenn Sie möchten, fügen Sie eine Vorwärtsdeklaration ohne Parametrierung hinzu.
Ein hinzugefügtes Merkmal gilt im Allgemeinen für alle Rollen mit demselben Namen.
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) { }
}
Wenn Sie es dann verwenden, wird es automatisch so geladen, dass es unter einem vollständig qualifizierten Namen zugänglich ist.
{
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'
In diesem Fall können Sie es in eine Modulanweisung einfügen, damit Sie nicht Foo::
so oft schreiben müssen .
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) { }
}
Die Rolle ist weiterhin zugänglich als Foo::Bar
.
Es würde mich nicht wundern, wenn dies genau den gleichen Code wie im vorherigen Beispiel ergeben würde.
Der einzige Grund zum Hinzufügen is export
ist, wenn Sie möchten, dass es als Bar
statt exportiert wird Foo::Bar
. Dies gilt für beide obigen Beispiele.
Ich vermute, dass Sie dachten, dass Sie immer verwenden mussten is export
. In vielen Fällen wirklich nicht.
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`
Wenn Sie es nur verwenden baz()
möchten, während es sich im Umfang des Moduls befindet, müssen Sie es dann und nur dann exportieren.
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
Beachten Sie, dass ich es immer noch so deklariert habe our
, dass jemand, der nicht möchte, dass Sie es exportieren, weiterhin für ihn zugänglich ist.
use Foo::Bar ();
# say baz(); # baz used at line 1. Did you mean 'bag'?
say Foo::Bar::baz(); # hello world
Der gesamte Zweck von is export
besteht darin, die Notwendigkeit zu beseitigen, vollständig qualifizierte Namen für Funktionen zu verwenden. Dass es auch für Dinge wie Rollen funktioniert, ist ein Nebeneffekt.
our
Deklarationen mit Gültigkeitsbereich in Modulen ohneunit
Deklarationen mit Gültigkeitsbereich wurden aus irgendeinem Grund global. Ich erwähnte das Verhalten mit,is export
weil ich davon ausging, dass die Leute zuerst versuchen könnten, so etwas zu exportieren.unit module Foo
sollte aber seinunit package Foo
. Wenn es sich um ein Modul handelt und anFoo
anderer Stelle vorhanden ist, werden die Symbole nicht ordnungsgemäß zusammengeführt, wenn beideFoo::Bar
undFoo
importiert werden.