<center> 第十八章 Caché 函数大全 $GET 函数
返回指定变量的数据值。
大纲
$GET(variable,default)
$G(variable,default)
Parameters
- variable 下标或未下标的局部变量,全局变量或进程专用全局变量。该变量可能是未定义的。可以使用
obj.property
语法将变量指定为多维对象属性。 - default 可选-如果变量未定义,则返回的值。如果是变量,则必须定义。
描述
$GET
返回指定变量的数据值。未定义变量的处理取决于是否指定默认参数。
-
$GET(variable)
返回指定变量的值,如果变量未定义,则返回空字符串。变量参数值可以是任何变量的名称,包括带下标的数组元素(局部变量或全局变量)。 -
$GET(variable,default)
提供一个默认值,如果变量未定义,则返回该值。如果定义了变量,则$GET
返回其值。
DHC-APP>w $g(a,"asc")
asc
参数
variable
要返回其数据值的变量。
- 变量可以是局部变量,全局变量或进程专用全局(PPG)变量。它可以下标或不下标。
该变量不需要是定义的变量。$GET
返回未定义变量的空字符串;它不定义该变量。可以定义变量并将其设置为空字符串(“”
)。如果是全局变量,则它可以包含扩展的全局引用。如果是带下标的全局变量,则可以使用裸全局引用指定它。即使在引用未定义的下标全局变量时,变量也会重置裸指示符,从而影响将来的裸全局引用,如下所述。
- 变量可以是多维对象属性,不能是非多维对象属性。尝试在非多维对象属性上使用
$GET
会导致<Object Dispatch>
错误。
$GET
无法返回代理对象属性的属性值。相反,Caché会发出一条消息,指出指定的属性不存在。此属性访问限制对于类%ZEN.proxyObject
是唯一的,该类在InterSystems类参考中定义。
default
未定义变量时要返回的数据值。它可以是任何表达式,包括局部变量或全局变量,带下标或不带下标。如果是全局变量,则它可以包含扩展的全局引用。如果是带下标的全局变量,则可以使用裸全局引用指定它。如果存在,DEFAULT将重置裸指示器,从而影响将来的裸全局引用,如下所述。
如果DEFAULT是一个未定义的变量,则默认情况下,$GET
会发出<UNDEFINED>
错误,即使定义了变量也是如此。通过设置%SYSTEM.Process.Unfined()
方法,可以更改Caché行为,使其在引用未定义变量时不会生成<UNDEFINED>
错误。如果unfined()
方法设置为不生成<UNDEFINED>
错误,则当默认值为unfined时,$GET
将返回变量。
示例
在下面的示例中,定义了变量test
,而未定义变量xtest
。(使用ZWRITE
命令是因为它显式返回NULL
字符串值。)
/// d ##class(PHA.TEST.Function).Get()
ClassMethod Get()
{
KILL xtest
SET test="banana"
SET tdef=$GET(test),tundef=$GET(xtest)
ZWRITE tdef ; $ GET测试的返回值
ZWRITE tundef ; $ GET为xtest返回空字符串
WRITE !,$GET(xtest,"none")
; $ GET返回未定义变量的默认值“ none”
}
DHC-APP>d ##class(PHA.TEST.Function).Get()
tdef="banana"
tundef=""
none
在以下示例中,将多维属性用作变量值。本示例返回所有定义的名称空间的名称:
/// d ##class(PHA.TEST.Function).Get1()
ClassMethod Get1()
{
SET obj = ##class(%ResultSet).%New("%SYS.Namespace:List")
DO obj.Execute()
WRITE !,$GET(obj.Data,"none") // returns "none"
SET x=1
WHILE x'="" {
DO obj.Next()
SET x=$GET(obj.Data("Nsp"))
IF x'="" {
WRITE !,"Namespace: ",x }
}
WRITE !,"Done!"
}
DHC-APP>d ##class(PHA.TEST.Function).Get1()
none
Namespace: %SYS
Namespace: DHC-APP
Namespace: DHC-CHSSWEB
Namespace: DHC-CSM
Namespace: DHC-DATA
Namespace: DHC-DWR
Namespace: DHC-EKG
Namespace: DHC-HEIS
Namespace: DHC-HR
Namespace: DHC-LISDATA
Namespace: DHC-LISSRC
Namespace: DHC-MEDSRC
Namespace: DHC-MRQ
Namespace: DOCBOOK
Namespace: FDBMS
Namespace: PACS
Namespace: PIS
Namespace: RIS
Namespace: SAMPLES
Namespace: USER
Done!
类似的程序使用$DATA
函数返回相同的信息。
注意
DATA相比
$GET
为未定义变量($DATA = 0
)和为无数据的向下指针的数组节点($DATA = 10
)提供了$DATA
测试的替代方法。如果变量是未定义的或没有数据的指针数组节点,则$GET
返回空字符串(“”
),而不会出现未定义的错误。例如,可以重新编码以下行:
IF $DATA(^client(i))=10 {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
或
IF $GET(^client(i))="" {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
请注意,$DATA
测试比$GET
测试更具体,因为它们使能够区分未定义元素和仅是向下指针的元素。例如,这些行:
IF $DATA(^client(i))=0 { QUIT }
ELSEIF $DATA(^client(i))=10 {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
无法重新编码为:
IF $GET(^client(i))="" { QUIT }
ELSEIF $GET(^client(i))="" {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
这两行根据数组元素是未定义的还是没有数据的向下指针执行不同的操作。如果在这里使用$GET
,则只会执行第一个动作(QUIT
)。可以将$DATA
用于第一个测试,将$GET
用于第二个测试,但不能反向使用($GET
用于第一个测试,$DATA
用于第二个测试)。
默认值为SELECT
$GET(variable,default)
允许在未定义指定变量时返回默认值。可以使用$SELECT
函数执行相同的操作。
但是,与$SELECT
不同,$GET
中的第二个参数始终被求值。
如果变量和默认值都使用下标的全局引用并因此都修改了裸指标,则$GET
始终会评估其两个参数这一事实很重要。因为参数是按从左到右的顺序求值的,所以无论$GET
是否返回默认值,裸指标都设置为默认的全局引用。
处理未定义的变量
如果指定的变量未定义,$GET
定义处理行为。如果未定义指定的变量,则$GET
的基本形式将返回一个空字符串(“”
)。
$DATA
测试是否定义了指定的变量。如果变量未定义,则返回0。
可以使用%SYSTEM.Process
类的Undefined()
方法为每个进程定义所有未定义变量的处理行为。可以通过设置Config.Miscellaneous
类的Undefined
属性来建立系统范围的默认行为。设置未定义对指定变量的$GET
或$DATA
处理没有影响。
网友评论