Q Language - Type Casting

Spesso è necessario modificare il tipo di dati di alcuni dati da un tipo a un altro. La funzione di casting standard è "$"dyadic operator.

Vengono utilizzati tre approcci per eseguire il cast da un tipo a un altro (ad eccezione della stringa):

  • Specificare il tipo di dati desiderato tramite il nome del simbolo
  • Specificare il tipo di dati desiderato in base al suo carattere
  • Specificare il tipo di dati desiderato tramite il valore breve.

Casting di numeri interi in float

Nel seguente esempio di casting di interi in float, tutti e tre i diversi modi di casting sono equivalenti:

q)a:9 18 27

q)$[`float;a]     / Specify desired data type by its symbol name, 1st way
9 18 27f

q)$["f";a]        / Specify desired data type by its character, 2nd way
9 18 27f

q)$[9h;a]         / Specify desired data type by its short value, 3rd way
9 18 27f

Controlla se tutte e tre le operazioni sono equivalenti,

q)($[`float;a]~$["f";a]) and ($[`float;a] ~ $[9h;a])
1b

Casting di stringhe in simboli

Il cast di stringhe in simboli e viceversa funziona in modo leggermente diverso. Controlliamolo con un esempio:

q)b: ("Hello";"World";"HelloWorld")    / define a list of strings

q)b
"Hello"
"World"
"HelloWorld"

q)c: `$b                               / this is how to cast strings to symbols

q)c                                    / Now c is a list of symbols
`Hello`World`HelloWorld

Il tentativo di eseguire il cast di stringhe a simboli utilizzando le parole con chiave `symbol o 11h fallirà con l'errore di tipo -

q)b
"Hello"
"World"
"HelloWorld"

q)`symbol$b
'type

q)11h$b
'type

Casting di stringhe a non simboli

Il cast di stringhe in un tipo di dati diverso dal simbolo viene eseguito come segue:

q)b:900               / b contain single atomic integer

q)c:string b          / convert this integer atom to string “900”

q)c
"900"

q)`int $ c            / converting string to integer will return the
                      / ASCII equivalent of the character “9”, “0” and
                      / “0” to produce the list of integer 57, 48 and
                      / 48.
57 48 48i

q)6h $ c              / Same as above
57 48 48i

q)"i" $ c             / Same a above
57 48 48i

q)"I" $ c
900i

Quindi per lanciare un'intera stringa (l'elenco di caratteri) a un singolo atomo di tipo di dati x richiede di specificare la lettera maiuscola che rappresenta il tipo di dati x come primo argomento di $operatore. Se specifichi il tipo di dati dix in qualsiasi altro modo, il cast viene applicato a ciascun carattere della stringa.