Idioma Q - Tipo de Casting

Freqüentemente, é necessário alterar o tipo de dados de alguns dados de um tipo para outro. A função de fundição padrão é o “$”dyadic operator.

Três abordagens são usadas para lançar de um tipo para outro (exceto para string) -

  • Especifique o tipo de dados desejado por seu nome de símbolo
  • Especifique o tipo de dados desejado por seu caractere
  • Especifique o tipo de dados desejado por seu valor curto.

Fundição de inteiros para flutuadores

No exemplo a seguir de conversão de inteiros em flutuantes, todas as três formas diferentes de conversão são equivalentes -

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

Verifique se todas as três operações são equivalentes,

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

Fundindo Strings em Símbolos

Transformar string em símbolos e vice-versa funciona de maneira um pouco diferente. Vamos verificar com um exemplo -

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

A tentativa de converter strings para símbolos usando o símbolo de palavras-chave `ou 11h irá falhar com o erro de tipo -

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

q)`symbol$b
'type

q)11h$b
'type

Fundindo Strings em Non-Symbols

A conversão de strings para um tipo de dados diferente de símbolo é realizada da seguinte maneira -

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

Portanto, para converter uma string inteira (a lista de caracteres) em um único átomo de tipo de dados x exige que especifiquemos a letra maiúscula que representa o tipo de dados x como o primeiro argumento para o $operador. Se você especificar o tipo de dados dex de qualquer outra forma, resulta na aplicação do elenco a cada caractere da string.