0

根据https://code.kx.com/q/ref/enumerate/上的文档

枚举

句法:x$y, $[x;y]

在哪里

  • x并且y是列表

我想一个正确的创建enum方法是通过将列表提供给$

q)e:`a`b`c$`b`a`c`c`a`b
'length
  [0]  e:`a`b`c$`b`a`c`c`a`b
               ^

但显然不是。在阅读了更多示例后,我尝试了:

q)mykeys:`a`b`c
q)show e:`mykeys$`b`a`c`c`a`b
`mykeys$`b`a`c`c`a`b

它有效。但后来我看到 myenum e包含它的值,并且只引用它的键mykeys

q)(key;value)@\:e
`mykeys
`b`a`c`c`a`b
q)`:e.raw set e
`:e.raw

所以保存e到文件不会保存任何密钥!在新的会话中:

q)e: get `:e.raw
q)e
`mykeys!1 0 2 2 0 1
q)mykeys
'mykeys
  [0]  mykeys
       ^
q)mykeys:`a`b`c
q)e
`mykeys$`b`a`c`c`a`b

我知道可以使用简洁的枚举扩展功能来保存密钥:

q)`:mykeys?`b`a`c`c`a`b;
q)get `:mykeys
`b`a`c

但是为什么枚举会这样呢?- 似乎它们几乎没有分成。可能是在一张大图中,有表、索引、张开的表更有意义。

以及从文件加载后如何存在枚举?当它的键域还不存在时,它是一种半正常状态吗?:

q)e: get `:e.raw
q)e
`mykeys!1 0 2 2 0 1
4

1 回答 1

1

这种行为是设计使然,因为正如您所推测的那样,存在更大、更普遍的情况。

枚举主要用于:

  1. sym 文件,其中 syms(密钥)在 enum-extend 的帮助下始终永久存储在数据库中?
  2. 外键,根据https://code.kx.com/q4m3/8_Tables/#852-example-of-simple-foreign-key

在后一种情况下,将键与枚举一起存储是没有意义的,因为键是表的内容。假设如果您将持久化枚举,那么您还将持久化包含键的表。

类似的概念是列链接 - https://code.kx.com/q/kb/linking-columns/

最后,原因

`a`b`c$`b`a`c`c`a`b

不起作用是因为您要枚举的列表必须按名称传递,而不是按值传递。所以它必须是

`mykeys$`b`a`c`c`a`b
于 2020-05-11T08:07:51.797 回答