Simple, solo use el our
alcance predeterminado sin unit
nada alrededor .
unit
Só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 sub
en 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 export
es si desea que se exporte como en Bar
lugar 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 our
modo 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 export
es eliminar la necesidad de usar nombres totalmente calificados para las funciones. Que también funcione para cosas como los roles es un beneficio secundario.
our
las declaraciones con alcance en módulos sinunit
declaraciones con alcance se convirtieron en globales por alguna razón. Mencioné el comportamiento conis export
porque supuse que así es como la gente podría intentar exportar algo como esto.unit module Foo
debería ser asíunit package Foo
. Si se trata de un módulo, entonces si hay alguna existenteFoo
en otros lugares, a continuación, los símbolos serán no combinar adecuadamente si ambosFoo::Bar
yFoo
son importados.