Langue Q - Casting de type

Il est souvent nécessaire de changer le type de données de certaines données d'un type à un autre. La fonction de diffusion standard est le "$"dyadic operator.

Trois approches sont utilisées pour passer d'un type à un autre (sauf pour la chaîne) -

  • Spécifiez le type de données souhaité par son nom de symbole
  • Spécifiez le type de données souhaité par son caractère
  • Spécifiez le type de données souhaité par sa valeur courte.

Conversion d'entiers en flottants

Dans l'exemple suivant de conversion d'entiers en flottants, les trois différentes méthodes de conversion sont équivalentes -

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

Vérifiez si les trois opérations sont équivalentes,

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

Conversion de chaînes en symboles

La conversion d'une chaîne en symboles et vice versa fonctionne un peu différemment. Vérifions-le avec un exemple -

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

Tenter de convertir des chaînes en symboles en utilisant les mots clés `symbole ou 11h échouera avec l'erreur de type -

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

q)`symbol$b
'type

q)11h$b
'type

Conversion de chaînes en non-symboles

La conversion de chaînes en un type de données autre que symbole est effectuée comme suit:

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

Donc, pour convertir une chaîne entière (la liste des caractères) en un seul atome de type de données x nous oblige à spécifier la lettre majuscule représentant le type de données x comme premier argument de la $opérateur. Si vous spécifiez le type de données dex de toute autre manière, il en résulte que le cast est appliqué à chaque caractère de la chaîne.