Функция, которая принимает строку в качестве параметра - PullRequest
0 голосов
/ 06 сентября 2018

В kdb я хотел бы иметь функцию, которая принимает строку в качестве параметра.

myfunc: {[strParam]
    .... 
}

Однако, когда я пытался вызвать функцию.

q) myfunc["test"]

жалуется на length ошибку. Кажется, что функция видит "test", передавая 4 параметра типа char. Как я могу заставить функцию ожидать строку?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Строка в kdb определяется как список символов, поэтому функции, использующие их, должны иметь возможность справиться с этим.

q)count "test"
4

Вы также можете использовать символ вместо приведения из строки, используя `symbol$"test". Символ является атомарным и имеет фиксированную ширину, поэтому его можно использовать в качестве ключей для словаря или таблицы. Некоторые функции для строк по-прежнему будут работать с символами, например

q)upper `test
`TEST

пока операция со списком не будет работать, и вам придется превратить ее обратно в строку, используя string `test перед использованием этих операций.

Когда выдается ошибка длины, и вы переходите в режим отладки, как показано в приглашении q с двумя скобками q)), вы можете использовать функции .z.ex, чтобы показать сбойную функцию, и .z.ey, чтобы увидеть сбой аргументы, чтобы сузить, какая часть выдает ошибку.

0 голосов
/ 06 сентября 2018

Ошибка может появиться по нескольким причинам.

q)f:{[p] show p}  //it works fine with any number of elements 
q)f["abc"]
"abc"

f:{[p] enlist[`k]!p}   //needs a list of single element
f["abc"]
'length

f[enlist "abc"]      
(enlist `k)!enlist "abc"

q)f:{[p] 1 2 3 4!p}    //the length of values is different from the length of keys
q)f["abc"]
'length

q)f["abcd"]
(1j, 2j, 3j, 4j)!"abcd"
...