使用 KDB 时有时需要副作用吗?
Are side-effects sometimes necessary when using KDB?
假设我有一个状态变量 s
。
我有一个 .z.ws
钩子可以响应 websocket 消息并运行:
.z.ws: {handleMsg x}
我是否必须将 s
声明为全局 handleMsg
才能更新 s
?
理想情况下,我想要的是:
s: handleMsg[s;x]
其中 handleMsg
是一个纯函数(它不影响内部的任何全局变量)。
我是否应该将 s
声明为全局,然后尝试在 websocket 回调中执行此分配?
您不会 pre-declare 变量在 kdb 中作为全局变量,如果您在任何时候将它们设为全局变量(并且如果您将它们作为全局引用),它们就是全局变量。
q)func:{x+1}
/s is local and treated as such
q){s:func[1]}[]
2
/it is not a global
q)s
's
/this would make it global
q){`s set func[1]}[]
`s
/or
q){s::func[1]}[]
/now it's global
q)s
2
/but a local of the same name would take preference
q){s:func[100];s}[]
101
q)s
2
/you can force-reference the global if required
q){s:func[100];value `s}[]
2
所以您可以完全控制什么是全局的,什么不是全局的,什么时候引用本地的,什么时候引用全局的。
假设我有一个状态变量 s
。
我有一个 .z.ws
钩子可以响应 websocket 消息并运行:
.z.ws: {handleMsg x}
我是否必须将 s
声明为全局 handleMsg
才能更新 s
?
理想情况下,我想要的是:
s: handleMsg[s;x]
其中 handleMsg
是一个纯函数(它不影响内部的任何全局变量)。
我是否应该将 s
声明为全局,然后尝试在 websocket 回调中执行此分配?
您不会 pre-declare 变量在 kdb 中作为全局变量,如果您在任何时候将它们设为全局变量(并且如果您将它们作为全局引用),它们就是全局变量。
q)func:{x+1}
/s is local and treated as such
q){s:func[1]}[]
2
/it is not a global
q)s
's
/this would make it global
q){`s set func[1]}[]
`s
/or
q){s::func[1]}[]
/now it's global
q)s
2
/but a local of the same name would take preference
q){s:func[100];s}[]
101
q)s
2
/you can force-reference the global if required
q){s:func[100];value `s}[]
2
所以您可以完全控制什么是全局的,什么不是全局的,什么时候引用本地的,什么时候引用全局的。