Saltar al contenido

Declarar e inicializar un tipo array de un rango

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 nuevo Array (inicializado para estar vacío) y lo “vincula” al símbolo @a. Por lo tanto my @a; say @a.^name devoluciones Array. No hay necesidad de usar la palabra Array 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 un Array con un Array restricción de tipo en sus elementos (por lo que es una array de matrices). my Array @a; say @a.^name devoluciones Array[Array] para indicar esto. my Array @a = 'a'..'z'; falla al copiar el primer valor (“a”) porque es un Str valor no un Array.

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 Mula 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 Positionalel 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 una 0 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *