Simples, basta usar o our
escopo padrão sem envolver unit
nada.
unit
só foi adicionado para que você não teria que cercam um arquivo inteiro com {
e }
quando havia apenas um module
, package
, class
, role
, ou sub
no arquivo.
Você nem sempre precisa usá-lo.
Na verdade, você nunca precisa usá-lo.
Se desejar, adicione uma declaração direta sem uma parametrização.
Uma característica adicionada a ela geralmente se aplica a todas as funções com o mesmo nome.
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) { }
}
Então, quando você o usa, ele é carregado automaticamente de forma que seja acessível por nome totalmente qualificado.
{
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'
Nesse caso, você pode colocá-lo dentro de uma instrução de módulo para não precisar escrever com Foo::
tanta frequência.
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) { }
}
O papel ainda está acessível como Foo::Bar
.
Eu não ficaria surpreso se isso resultasse exatamente no mesmo código do exemplo anterior.
O único motivo para adicionar is export
é se você deseja que ele seja exportado como em Bar
vez de Foo::Bar
. Isso se aplica aos dois exemplos acima.
Meu palpite é que você pensou que sempre precisava usar is export
. Em muitos casos, você realmente não.
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`
Se você quisesse usá- baz()
lo apenas dentro do escopo do módulo, e somente então precisará exportá-lo.
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
Observe que eu ainda o declarei, de our
modo que, se alguém não quiser que você o exporte, ele ainda estará acessível a eles.
use Foo::Bar ();
# say baz(); # baz used at line 1. Did you mean 'bag'?
say Foo::Bar::baz(); # hello world
O objetivo de todo is export
é remover a necessidade de usar nomes totalmente qualificados para funções. Que ele também funcione para coisas como papéis é um benefício colateral.
our
declarações com escopo definido em módulos semunit
declarações com escopo se tornassem globais por algum motivo. Eu mencionei o comportamentois export
porque presumi que é assim que as pessoas podem primeiro tentar exportar algo assim.