持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第43天,点击查看活动详情
New命令
支持以下语法形式:
NEW // 为所有局部变量启动新上下文
NEW x // 为指定的局部变量启动新上下文
NEW x,y,z // 为列出的局部变量启动新上下文
NEW (y) // 为除指定变量之外的所有局部变量启动新上下文
NEW (y,z) // 为除列出的变量之外的所有局部变量启动新上下文
NEW命令不能用于以下内容:
- Globals 全局变量
- Process-Private Globals 私有进程全局变量
- Local variable subscripts 局部变量下标
- 特殊变量,
$ESTACK、$ETRAP、$NAMESPACE和$ROLES除外
在这些上下文中使用NEW都会报<SYNTAX>错误。
- 在程序中也就是类程序中,默认都是私有变量不能
NEW。如果要使用NEW命令需要在类添加关键字Not ProcedureBlock。
Class XX Extends %RegisteredObject [Not ProcedureBlock]
{
}
- 无参数
new,初始化所有变量。
ClassMethod New()
{
s a = 1, b = 2, c = 3, d = 4, e = 5
w !,"NEW之前:",!
zw
n
w !,"NEW之后:",!
zw
q ""
}
- 带参数
new,只初始化列表里的变量。
ClassMethod New1()
{
s a = 1, b = 2, c = 3, d = 4, e = 5
w !,"NEW之前:",!
zw
n d,e
w !,"NEW之后:",!
zw
q ""
}
独占new,替换本地变量环境中除指定变量之外的所有现有变量。除了括号里的变量其他变量都初始化。
ClassMethod New2()
{
s a = 1, b = 2, c = 3, d = 4, e = 5
w !,"NEW之前:",!
zw
n (d,e)
w !,"NEW之后:",!
zw
q ""
}
-
独占NEW最多可以指定255个变量作为逗号分隔的列表。 超过此数字Caché发出<SYNTAX>错误。 -
尝试发出超过
31个级别的独占NEW或无参数NEW会导致<MAXSCOPE>错误。
ClassMethod New3()
{
for i = 1 : 1 : 32 {
w i, !
n (i)
}
q ""
}
Merge命令
将全局变量或多维数组节点并到目标变量。
MERGE将数据源复制到目标变量,并将数据源的所有后代复制到目标的后代。它不修改数据源,也不终止目标中的任何节点。MERGE简化了将变量的子树(多个下标)复制到另一个变量的过程。这两个变量都可以是带下标的局部变量、进程私有全局变量或全局变量。子树是指定变量的后代的所有变量。Merge为当前的节点复制技术提供了命令替代方案:带有$ORDER引用的SET命令。
/// d ##class(YX.M16).Merge()
ClassMethod Merge()
{
k ^a,^b
s ^a="cartoons"
s ^a(1)="The Flintstones",^a(2)="The Simpsons"
s ^a(1, 1)="characters",^a(1, 2)="place names"
s ^a(1, 1, 1)="Flintstone family"
s ^a(1, 1, 1, 1)="Fred"
s ^a(1, 1, 1, 2)="Wilma"
s ^a(1, 1, 2)="Rubble family"
s ^a(1, 1, 2, 1)="Barney"
s ^a(1, 1, 2, 2)="Betty"
m ^b = ^a(1,1)
zw ^b
}
假设如图^X和^Y的初始结构
MERGE ^X(2,3)=^Y(3,6,7,8)
发出以上语句时,Caché会将^Y的一部分复制到^X(2,3)中。现在,全局变量^X的结构如下图所示。
Merge命令的^X和^Y的结果
ClassMethod Merge1()
{
k ^X,^Y
s ^X(2,2)="first"
s ^X(2,2,4)="second"
s ^Y(3,6,7)="third"
s ^Y(3,6,8)="fourth"
s ^Y(3,6,7,8,4)="fifth"
s ^Y(3,6,7,8,9)="sixth"
merge ^X(2,3)=^Y(3,6,7,8)
zw ^X
zw ^Y
}