dotz.zu用户重新分配的方法

ego*_*or7 2 kdb

只是想知道为什么第三种方法有效,如果第一种方法不起作用?:

.z.u:`admin          // silently doesn't work (.z.u unchanged)
`.[`.z.u]:`admin     // 'assign
@[`.;`.z.u;:;`admin] // ok!
Run Code Online (Sandbox Code Playgroud)

它看起来像是某种文本覆盖,之后

delete .z.u from `.
Run Code Online (Sandbox Code Playgroud)

.z.u恢复正常。所以可能 q 在前两种情况下检测到这些覆盖并礼貌地要求我们不要这样做。

最初的问题是:为什么会这样:

h{.z.w{.z.u},`},`
Run Code Online (Sandbox Code Playgroud)

返回空?并使无辜的过程在其他人看来很糟糕,因为它.z.u被调用时变得空了.z.w。但这是相同的过程 - 没有任何改变..我是否需要在每个过程上都放置这条奇特的线来解决这个问题?:

@[`.;`.z.u;:;.z.u]
Run Code Online (Sandbox Code Playgroud)

或者更意识形态地使用:

0[`.z.u]
Run Code Online (Sandbox Code Playgroud)

获取进程用户?

奇怪的是,.z.h这是不同的行为(正如预期的那样)。为什么不.z.h也删除:)?

Sea*_*hir 7

因此,在这种情况下,您覆盖 .zu 并不完全正确。

您所说的@[`.;`.z.u;:;`admin]是“在根命名空间内创建一个名为 .zu 的新变量”。q 确实做了这样的事情:它创建了一个名为 的新变量.z.ua:1该变量的存在方式与或 等变量的存在方式相同 var:123

从 q 的角度来看,该变量不存在于 .z 命名空间中,它存在于根命名空间中。我们可以看到原始内容.z.u保持不变,例如,通过检查另一个名称空间的值:

q)@[`.;`.z.u;:;`admin]
`.
q).z.u
`admin
q)\d .test       ^
q.test).z.u
`HehirS
Run Code Online (Sandbox Code Playgroud)

虽然我不建议这样做,但您也可以使用通常不可分配的其他名称来执行此技巧,例如:

q)@[`.;`123;:;"hi"]
`.
q)123
123
q)value`123
"hi"
Run Code Online (Sandbox Code Playgroud)

您还可以尝试不同的 .z 变量,但您的里程数会有所不同:

// server process
q)\p 9876
q)@[`.;`.z.pg;:;{break}]
`.
q).z.pg
{break}

// client process
q)h:hopen`::9876
q)h"2+2"
4
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,虽然 .z.pg 看起来已被重新分配为“收到同步消息时中断”,但我们可以看到 .z.pg 的默认行为仍然保留。

另请注意:

`.[`.z.u]:`admin
Run Code Online (Sandbox Code Playgroud)

这对于任何变量都不起作用。您尝试为结果分配一个值,但`.[`.z.u]该值对解释器来说没有意义。