【问题标题】:Applying elements to object vs applying them to object's symbol name将元素应用于对象与将它们应用于对象的符号名称
【发布时间】:2021-07-18 15:28:55
【问题描述】:

我看到了一种通过符号而不是名称访问目录元素的技术(请参阅q.k):

`.q `svar`sdev`scov`med / instead of .q `svar`sdev`scov`med

为什么以及何时这种方法有用?


由于某种原因,与@ apply 相比,该行为是相反的:

q)l:til 5
q)`l[2 3]: 20 30 / 'assign, `l not changed
/ (upd: `l is not just a symbol here, it is exactly refers to a list: `l[2 3] gets l elements)
q)l[2 3]: 21 31; l / l changed
0 1 21 31 4

但是当我们使用@ apply 语法时,结果是相反的:

q)@[l;2 3;:;22 32]; l / l not changed
0 1 21 31 4
q)@[`l;2 3;:;23 33]; l / `l changed
0 1 23 33 4

更新: 将索引应用于符号在 shakti 中不起作用,看起来这个想法没有经受住时间的考验。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    按目录,我认为您的意思是字典,因为这是您调用 .q 时返回的数据结构。

    您可以通过多种方式访问​​字典元素:

    q)d:`a`b`c!1 2 3
    q)d
    a| 1
    b| 2
    c| 3
    q)d`a
    1
    q)`d `a
    1
    q)d[`a]
    1
    q)@[d;`a]
    1
    q)@[`d;`a]
    1
    q) / etc ...
    

    彼此都是syntactic sugar,这取决于你喜欢哪个(或者情况要求更好)。

    在下面的代码中,

    q)`l[2 3]:20 30
    'assign
      [0]  `l[2 3]:20 30
    

    `l 只是符号 `l,而不是对列表 l 的引用,这就是您收到分配错误的原因。

    @ 运算符略有不同,

    q)@[l;0;:;20]
    20 1 2 3 4
    q)l
    0 1 2 3 4
    q) / -vs-
    q)@[`l;0;:;20]
    `l
    q)l
    20 1 2 3 4
    

    将反引号添加到l 是告诉 q 您要更新l 而不仅仅是将操作应用于列表并返回结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多