Język Q - rzutowanie typów

Często wymagana jest zmiana typu danych niektórych danych z jednego typu na inny. Standardową funkcją rzutowania jest „$”dyadic operator.

Do rzutowania z jednego typu na inny (z wyjątkiem stringów) używane są trzy podejścia -

  • Określ żądany typ danych, podając jego nazwę symbolu
  • Określ żądany typ danych za pomocą jego znaku
  • Określ żądany typ danych za pomocą krótkiej wartości.

Rzutowanie liczb całkowitych na zmiennoprzecinkowe

W poniższym przykładzie rzutowania liczb całkowitych na zmiennoprzecinkowe wszystkie trzy różne sposoby rzutowania są równoważne -

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

Sprawdź, czy wszystkie trzy operacje są równoważne,

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

Rzutowanie łańcuchów na symbole

Rzutowanie ciągu znaków na symbole i odwrotnie działa nieco inaczej. Sprawdźmy to na przykładzie -

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

Próba rzutowania ciągów na symbole przy użyciu słów kluczowych `symbol lub 11h zakończy się niepowodzeniem z błędem typu -

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

q)`symbol$b
'type

q)11h$b
'type

Rzutowanie łańcuchów na symbole niebędące symbolami

Rzutowanie ciągów na typ danych inny niż symbol odbywa się w następujący sposób -

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

Zatem rzutowanie całego ciągu (listy znaków) na pojedynczy atom typu danych x wymaga od nas określenia dużej litery reprezentującej typ danych x jako pierwszy argument do $operator. Jeśli określisz typ danychx w inny sposób powoduje to, że rzutowanie jest stosowane do każdego znaku ciągu.