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.unit module Foo
deveria serunit package Foo
embora. Se for um módulo, se houver algumFoo
outro lugar, os símbolos não serão mesclados corretamente se ambosFoo::Bar
eFoo
forem importados.