Nuestro grupo de especialistas luego de días de investigación y recopilación de de datos, obtuvimos la respuesta, deseamos que te sea de utilidad para tu plan.
Solución:
TL;RD Proporciono una respuesta relativamente simple en ¿Por qué es este el caso? Sin embargo, esa explicación puede ser inadecuada.1 así que reviso algunas alternativas en Declarar e inicializar un tipo array de un rango.
¿Por qué es este el caso?
-
my @a;
declara un nuevoArray
(inicializado para estar vacío) y lo “vincula” al símbolo@a
. Por lo tantomy @a; say @a.^name
devolucionesArray
. No hay necesidad de usar la palabraArray
en una declaración o inicialización de un array — la@
es suficiente.2 -
my @a = 'a'..'z'
intenta dupdo cada valor en el rango'a'
a través de'z'
uno a la vez, en@a[0]
,@a[1]
etc. El nuevo array obligado a@a
tiene una restricción de tipo para cada uno de sus elementos (explicado en la siguiente sección); se verificará para cada valor (y tendrá éxito). -
my Array @a
declara unArray
con unArray
restricción de tipo en sus elementos (por lo que es una array de matrices).my Array @a; say @a.^name
devolucionesArray[Array]
para indicar esto.my Array @a = 'a'..'z';
falla al copiar el primer valor (“a”) porque es unStr
valor no unArray
.
Declarar e inicializar un tipo array de un rango
my @a = 'a'..'z';
Él my @a
parte de esta declaración declara una variable que está vinculada a (se refiere a) una nueva array de tipo Array
. Debido a que no se especificó ninguna restricción de tipo de elemento, el nuevo arrayLos elementos de están restringidos para ser consistentes con Mu
la METROost tunassuming tipo en P6. En otras palabras, es un vacío array listo para contener cualquier valor que quieras poner en él. (Se podría decir que say @a.^name
muestra Array
en vez de Array[Mu]
porque el [Mu]
se considera METROost tuinteresante.)
... = 'a'..'z'
inicializa el nuevo array. La inicialización no tiene ningún impacto en el arrayLas restricciones de tipo ya establecidas. Solo entrega copias de las cadenas. 'a'
, 'b'
etc. en la array (que se expande automáticamente para recibirlos en @a[0]
, @a[1]
etc.).
Recomiendo a los desarrolladores que eviten agregar restricciones de tipo explícitas en variables y coerciones explícitas de valores a menos que estén seguros de que son deseables. (cf mis comentarios entre paréntesis al final de una respuesta SO anterior). Dicho esto, puede elegir hacerlo:
my Str @a = 'a'..'z'; # `Array` elements constrained to `Str`
my Str @a = (0..99)>>.Str; # Coerce value to match constraint
Alternativamente, P6 admite explícita vinculanteen vez de asignación, de un valor o lista de valores. La forma más común de hacer esto es usar :=
en vez de =
:
my @a := 'a'..'z'; say @a.WHAT; say @a[25]; # (Range)z
Nótese cómo el enlace explícito de @a
significa @a
posee no estado atado a un nuevo Array
pero en cambio a la Range
valor. y porque un Range
puede comportarse como un Positional
el subíndice posicional aún funciona.
Las siguientes declaraciones serían, en mi opinión, tipeo explícito extremadamente redundante, pero funcionarían y producirían exactamente el mismo resultado, aunque la primera sería más rápida:
my Str @a := Array[Str].new('a'..'z');
my Str @a = Array[Str].new('a'..'z');
Hay más para discutir sobre este tema, pero quizás lo anterior proporcione suficiente para esta pregunta/respuesta. De lo contrario, haga más preguntas en los comentarios debajo de su pregunta original y/o a continuación.
notas al pie
1 Una versión anterior de esta respuesta comenzó con:
my Array @a ...
# My array of thoughts raised by this declaration
# and your questing "why?" in this SO question
# began with wry thoughts about complicated answers
# about reasons your array is awry and pedances
(Inventé la palabra “pedances” para significar algo que aparece ser pedante, pero fluye muy bien cuando se usa correctamente, lo que sucederá naturalmente una vez que te hayas familiarizado con su naturaleza aparentemente idiosincrásica pero realmente útil. Más importante aún, necesitaba algo que rime con “respuestas”).
2 Aquí hay un par de mnemotécnicos para el significado de @
en P6:
-
Eso parece un dígito cero (
0
) con un(Pequeña A cursiva matemática) en su interior — y un
@foo
variable es por defecto una0
indexado(o
@
). -
Eso suena como la palabra “en”. Un array tiene elementos en índices.
Establezca el tipo del elemento en el array:
mi Str @a = 'a'..'z'; decir @a; #[a b c d e f g
To see, what type it is, you can use .WHAT
my Str @a = 'a'..'z';
say @a.WHAT #(Array[Str])
Para probar si es un arraypuedes combinar inteligentemente
my Str @a = 'a'..'z';
say 'is array' if @a ~~ Array; #is array
say 'is str array' if @a ~~ Array[Str]; #is str array
say 'is str array' if @a ~~ Array[Int]; #
Él @('a'..'z')
hará un List
no un Array
. cambiándolo a
['a'..'z']
dará un Array
.
Pero eso aún le dará un error de tipo al asignarlo a my Array @a
como lo has hecho.
Si desea asignar un Array completo a un elemento de otro arraytienes que detallarlo de alguna manera, por ejemplo:
$[1,2,3]; #Still an array but treated as single item
[1,2,3], ; #Note the list operator (comma), this give you a list of lists
Entonces en tu caso:
'a'..'z';
es un rango, necesita ser convertido a un arrayasi que
['a'..'z'];
rango ahora se evalúa en un array
$['a'..'z'];
rango ahora se evalúa en un array y tomado como un solo elemento
my Array @a=$['a'..'z'];
say @a;
#OUTPUT:
#[[a b c d e f g h i j k l m n o p q r s t u v w x y z]]
# Which is an array of arrays;
No estoy seguro de si es lo que busca, pero elimina el error de tipo.
Puedes añadir valor a nuestra información tributando tu experiencia en las críticas.