首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kdb -如何通过引用kdb函数传递表

kdb -如何通过引用kdb函数传递表
EN

Stack Overflow用户
提问于 2022-11-13 03:26:29
回答 1查看 95关注 0票数 -2

定义问题

定义的空表myt

代码语言:javascript
复制
myt:([] id:`int$(); score:`int$())

例如,将一个或多个记录插入其中是很简单的。

代码语言:javascript
复制
`myt upsert `id`score!1 100

但是,在定义要插入到给定表中的函数时,这似乎是另一个窍门。

第一次尝试版本可能是

代码语言:javascript
复制
upd:{[t] t upsert `id`score!42 314;} 

upd[myt]

显然,它只更新了一个本地版本的myt,什么也不更新。

可能解决办法的困难

可能的解决方案1:使用全局变量代替

myt是一个全局变量,然后在函数中访问该变量。

代码语言:javascript
复制
upd:{`myt upsert `id`score!42 314;}

upd[]

如果需要很多myt,它看起来是一个很好的解决方案。在这种情况下,必须为upd函数提供大量副本,如下所示

代码语言:javascript
复制
upd0:{`myt0 upsert `id`score!42 314;}
upd1:{`myt1 upsert `id`score!42 314;}
upd2:{`myt2 upsert `id`score!42 314;}
...

所以,全局变量解在这里不是一个很好的解。

可能的解决方案2:修改表的外部功能

还可以通过在函数外部修改myt,通过删除结束的;返回修改后的结果来解决这个问题。

代码语言:javascript
复制
upd:{[t] t upsert `id`score!42 314}  / return inserted valued

myt:upd[myt]

它起作用了!但是在运行这段代码数百万次之后,它的工作速度越来越慢。因为这个解决方案放弃了upsert操作符的“就地”属性,所以随着表的大小越来越大,复制开销也会增加。

通过引用来传递论点?

也许这里的“通过引用”解决方案的概念。或者,对于这个问题,Q有自己的解决方案,但我还没有得到基本的想法。

通过在按名调用中添加"`“来更新已解决的问题

正如cillianreilly回答的那样,添加一个"" symbol in front ofmyt`“来将它作为全局变量传递到函数中是很简单的,所以完美的解决方案是直接的。

代码语言:javascript
复制
upd:{[t] t upsert `id`score!42 314;} 

upd[`myt] / it works
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-13 04:08:38

你的第一个版本应该能实现你想要的。如果将表名作为符号传递,它将更新全局变量并返回表名。如果您传递表本身,它将返回您可以在赋值中使用的更新表,正如您在可能的解决方案2中所发现的那样。请注意,实际的表不会被此操作更新。

代码语言:javascript
复制
q){[t;x]t upsert x}[myt;`id`score!42 314]
id score
--------
42 314
q)count myt
0
q){[t;x]t upsert x}[`myt;`id`score!42 314]
`myt
q)count myt
1

对于可能的解决方案1,为什么需要数百个myt表?无论如何,不需要将表名硬编码到函数中。您可以将表名作为上面演示的符号传递,这将为您更新全局信息。在其github上给出的官方kdb滴答示例正是在这种情况下使用插入,但实际上许多开发人员使用上插https://github.com/KxSystems/kdb-tick/blob/master/tick/r.q#L6

希望这能有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74418260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档