Учебники

Q Language — Кастинг типов

Часто требуется изменить тип данных некоторых данных с одного типа на другой. Стандартная функция приведения — это двоичный оператор «$».

Три подхода используются для приведения из одного типа в другой (кроме строки) —

  • Укажите желаемый тип данных по имени символа
  • Укажите желаемый тип данных по его символу
  • Укажите желаемый тип данных по его короткому значению.

Приведение целых чисел к плавающим

В следующем примере приведения целых чисел к плавающим, все три различных способа приведения эквивалентны —

q)a:9 18 27

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

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

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

Проверьте, все ли три операции эквивалентны,

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

Приведение строк в символы

Приведение строки к символам и наоборот работает немного по-другому. Давайте проверим это на примере —

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

Попытка привести строки к символам с использованием ключевых слов `symbol или 11h потерпит неудачу с ошибкой типа —

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

q)`symbol$b
'type

q)11h$b
'type

Приведение строк в не-символы

Преобразование строк в тип данных, отличный от символа, выполняется следующим образом:

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

Таким образом, для приведения всей строки (списка символов) к одному атому типа данных x необходимо указать заглавную букву, представляющую тип данных x, в качестве первого аргумента оператора $ . Если вы укажете тип данных x любым другим способом, это приведет к тому, что приведение будет применено к каждому символу строки.