Merge命令

74 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
}