Simple, solo use el ouralcance predeterminado sin unitnada alrededor .
unitSólo se añadió de modo que usted no tiene que rodear un archivo completo con {y }cuando sólo había una module, package, class, role, o suben el archivo.
No siempre tienes que usarlo.
De hecho, nunca tienes que usarlo.
Si lo desea, agregue una declaración directa sin una parametrización.
Un rasgo agregado generalmente se aplicará a todos los roles con el mismo nombre.
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) { }
}
Luego, cuando lo usa, se carga automáticamente de tal manera que sea accesible por nombre completo.
{
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'
En este caso, puede ponerlo dentro de una declaración de módulo para que no necesite escribir con Foo::tanta frecuencia.
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) { }
}
El rol sigue siendo accesible como Foo::Bar.
No me sorprendería si esto resultara exactamente el mismo código que el ejemplo anterior.
La única razón para agregar is exportes si desea que se exporte como en Barlugar de Foo::Bar. Esto se aplica a los dos ejemplos anteriores.
Supongo que pensaste que siempre necesitabas usar is export. En muchos casos, realmente no lo haces.
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`
Si desea poder usarlo baz()mientras lo tiene dentro del alcance del módulo, entonces y solo entonces necesita exportarlo.
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
Tenga en cuenta que todavía lo declare así, de ourmodo que si alguien no quiere que lo exporte, aún puede acceder a él.
use Foo::Bar ();
# say baz(); # baz used at line 1. Did you mean 'bag'?
say Foo::Bar::baz(); # hello world
El propósito de is exportes eliminar la necesidad de usar nombres totalmente calificados para las funciones. Que también funcione para cosas como los roles es un beneficio secundario.
ourlas declaraciones con alcance en módulos sinunitdeclaraciones con alcance se convirtieron en globales por alguna razón. Mencioné el comportamiento conis exportporque supuse que así es como la gente podría intentar exportar algo como esto.unit module Foodebería ser asíunit package Foo. Si se trata de un módulo, entonces si hay alguna existenteFooen otros lugares, a continuación, los símbolos serán no combinar adecuadamente si ambosFoo::BaryFooson importados.