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 }