在非默认(当前)命名空间中定义视图



根据 如何定义视图

视图及其依赖项只能在默认命名空间中定义。

q还有一个命令 \b:

语法: \b [命名空间]

列出命名空间中的依赖项(视图(。默认为当前命名空间。

据此,我想不仅可以在默认命名空间中创建视图:

$ q
KDB+ 3.6 2019.04.02 Copyright (C) 1993-2019 Kx Systems
m32/ ...
q)d .jar
q.jar)v::x+1
q.jar)d .
q)`. `v
x+1

但视图是在命名空间.创建的。

那么是否可以以某种方式在非默认(当前(命名空间中创建视图?如果不是,为什么有命令b [namespace]的参数?

问题的答案取决于您对命名空间的称呼。关于此主题的官方 q 文档即使没有误导,也是模糊的。例如,描述系统命令d的页面如下:

d (directory)

语法: \d [命名空间]

设置当前命名空间(也称为目录或上下文(。这 命名空间可以为空,当对象时会创建一个新的命名空间 在其中定义。提示指示当前命名空间。

如您所见,可选参数在第一行称为目录,但在第二行上变为命名空间。正如我们从第三行了解到的那样,这就是"称为上下文"。

但是,命名空间、目录和上下文这三个词在某些(但不是全部(情况下可以互换使用。定义视图就是这样一种情况,其中目录和命名空间之间的区别很重要。

由于官方术语缺乏明确性,让我向您推荐Nick Psaris的一本很棒的书"Q Tips:Fast,Scalable and Maintainable Kdb+"。Nick 区分了以"."开头的命名空间子集,并调用它们,并且仅调用它们目录。在他的术语中,所有目录都是命名空间,但并非所有命名空间都是目录。

事实证明,目录有限制;特别是,它们不能包含视图。但一个鲜为人知的事实是,不是目录的命名空间可以:

q).my.dir.v::x+1 / a (failed) attempt to create a view v in a directory
'x
[0]  .my.dir.v::x+1
q)my.ns.v1::x+1   / v1 is defined in a namespace
q)your.ns.v2::x-1 / so is v2
q)b
`symbol$()
q)b my.ns
,`v1
q)b your.ns
,`v2
q)x:41
q)my.ns.v1
42
q)your.ns.v2
40

最新更新