第四十一章 Caché 函數大全 $NAME 函數
返回變量的名稱值或下標引用的一部分
大綱
$NAME(variable,integer)
$NA(variable,integer)
參數
- variable 要返回其Name值的變量。它可以指定局部變量或全局變量,這些變量既可以是下標的,也可以是取消下標的。它不需要是定義的變量。但是,它可能不是已定義的私有變量。如果變量是帶下標的全局變量,則可以指定裸全局引用。
- integer 可選-指定要返回下標引用的哪個部分(級別)的數字值。它可以是正整數、變量名或表達式。使用時,變量必須是下標引用。
描述
$NAME
返回以變量形式提供的變量名引用的格式。它不會檢查此變量是否已定義或具有數據值。 $NAME
返回的值取決於所使用的參數。
-
$NAME(variable)
以規範形式返回指定變量的名稱值;即,作爲完全擴展的參考。 -
$NAME(variable,integer)
返回下標引用的一部分。具體來說,整數控制函數返回的下標數量。
該功能的執行不影響裸指示器。
參數
variable
變量可以是局部變量,進程專用全局變量或全局變量。它可以不下標或下標。如果變量是全局變量,則可以使用擴展的全局引用。
NAME`返回完整的全局引用。如果變量是私有變量,則會發生編譯錯誤。它可以是多維對象屬性。它不能是非多維對象屬性。嘗試在非多維對象屬性上使用$NAME
會導致<OBJECT DISPATCH>
錯誤
$NAME
無法返回特殊變量,即使是可以使用SET修改的變量也是如此。嘗試返回特殊變量將導致<SYNTAX>
錯誤。
integer
當變量是帶下標的引用時,使用整數參數。如果整數的值爲0,則$NAME
僅返回變量的名稱。如果整數的值小於變量中的下標數目,則$NAME
返回由整數的值指示的下標數目。如果integer大於變量中的下標數目,則$NAME
返回完整的下標引用。
如果變量是未下標的變量,則整數值將被忽略;否則,整數將被忽略。 $NAME
返回變量名稱。如果整數是空字符串(“”)
或非數字字符串,則$NAME
返回不帶下標的變量名稱。
整數的值接收標準整數解析。例如,前導零和加號將被忽略。小數位將被截斷並忽略。負整數值會導致<FUNCTION>
錯誤。
示例
在此示例中,integer參數指定要返回的級別。如果指定的整數下標數目匹配或超過下標級別的數目(在本例中爲3),則$NAME
返回所有定義的級別,其行爲就像指定了一個參數形式。如果指定整數級別零(0),空字符串(“”
)或任何非數字字符串(例如“A”
),則$NAME返回數組的名稱(在這種情況下爲“^client”
)
/// d ##class(PHA.TEST.Function).NAME()
ClassMethod NAME()
{
SET ^client(4)="Vermont"
SET ^client(4,1)="Brattleboro"
SET ^client(4,1,1)="Yankee Ingenuity"
SET ^client(4,1,2)="Vermonster Systems"
SET ^client("a",1,"b",2)="Vermont11"
WRITE !,$NAME(^client(4,1,1),1) ; returns 1 level
WRITE !,$NAME(^client(4,1,1),2) ; returns 2 levels
WRITE !,$NAME(^client(4,1,1),3) ; returns 3 levels
WRITE !,$NAME(^client(4,1,1),4) ; returns all (3) levels
WRITE !,$NAME(^client(4,1,1),0) ; returns array name
WRITE !,$NAME(^client(4,1,1),"") ; returns array name
WRITE !,$NAME(^client(4,1,1)) ; returns all (3) levels
WRITE !,$NAME(^client("a",1,"b",2),1)
WRITE !,$NAME(^client("a",1,"b",2),2)
WRITE !,$NAME(^client("a",1,"b",2),3)
WRITE !,$NAME(^client("a",1,"b",2),4)
}
DHC-APP> d ##class(PHA.TEST.Function).NAME()
^client(4)
^client(4,1)
^client(4,1,1)
^client(4,1,1)
^client
^client
^client(4,1,1)
^client("a")
^client("a",1)
^client("a",1,"b")
^client("a",1,"b",2)
在以下示例中,$NAME
在循環中與裸引用一起使用,以輸出當前(用戶提供)數組級別中所有元素的值。
/// d ##class(PHA.TEST.Function).NAME1()
ClassMethod NAME1()
{
READ !,"Array element: ",ary
SET x=@ary ; dummy operation to set current array and level
SET y=$ORDER(^("")) ; null string to find beginning of level
FOR i=0:0 {
WRITE !,@$NAME(^(y))
SET y=$ORDER(^(y))
QUIT:y=""
}
}
第一個SET命令執行虛擬分配,以建立用戶提供的數組和級別,作爲後續裸引用的基礎。 $ORDER
函數與裸引用一起使用以返回當前級別的第一個下標(無論是負數還是正數)的編號。
FOR
循環中的WRITE
命令將$NAME
與裸露的全局引用和參數間接引用一起使用,以輸出當前元素的值。 SET
命令使用帶有裸全局引用的$ORDER
返回下一個包含數據的現有元素的下標。最後,後置條件QUIT
檢查$ORDER
返回的值以檢測當前級別的結束並終止循環處理。
可以將返回的$NAME
字符串值用於名稱或下標間接尋址,或將其作爲參數傳遞給例程或用戶定義的函數考慮例程^DESCEND
,該例程列出了指定節點的後代節點。
DESCEND(ROOT) ;List descendant nodes
NEW REF
SET REF=ROOT
IF ROOT'["(" {
FOR {
SET REF=$QUERY(@REF)
QUIT:REF=""
WRITE REF,!
}
}
ELSE {
SET $EXTRACT(ROOT,$LENGTH(ROOT))=","
FOR {
SET REF=$QUERY(@REF)
QUIT:REF'[ROOT
WRITE REF,!
}
}
下面的示例演示如何使用$NAME
將參數傳遞給上一個示例中定義的^DESCEND
例程。
FOR var1="ONE","TWO","THREE" {
DO ^DESCEND($NAME(^X(var1)))
}
注意
用於$NAME
通常,使用$NAME
返回用於$DATA
和$ORDER
函數的數組元素的名稱值。
如果對數組元素的引用包含表達式,則$NAME
將在返回名稱的規範形式之前對錶達式進行求值。例如:
/// d ##class(PHA.TEST.Function).NAME4()
ClassMethod NAME4()
{
SET x=1+2
SET y=$NAME(^client(4,1,x))
WRITE y
}
DHC-APP>d ##class(PHA.TEST.Function).NAME4()
^client(4,1,3)
裸全局引用
$NAME
還接受裸全局引用,並以規範形式返回名稱值(即完整(非裸)引用)。指定一個沒有數組名稱的裸引用,並指定最近執行的全局引用。在以下示例中,第一個SET
命令建立全局引用,第二個SET
命令將$NAME
函數與裸全局引用一起使用。
/// d ##class(PHA.TEST.Function).NAME5()
ClassMethod NAME5()
{
SET ^client(5,1,2)="Savings/27564/3270.00"
SET y=$NAME(^(3))
WRITE y
}
DHC-APP>d ##class(PHA.TEST.Function).NAME5()
^client(5,1,3)
DHC-APP>zw ^client(5,1,3)
^client(5,1,3)="Reserve Credit/32456/125.00"
在這種情況下,$NAME
返回值^client(5,1,3)
。提供的下標值(3)替換了當前級別的現有下標值(2)。
擴展的全局引用
可以使用%SYSTEM
的RefInKind()
方法控制$NAME
是否在每個進程的基礎上以擴展的全局引用形式返回名稱值。過程類。系統範圍的默認行爲可以通過設置配置的RefInKind
屬性來建立。
在擴展引用模式生效的情況下,以下示例返回已定義的名稱空間和名稱^["PAYROLL"]MyRoutine
(如第一個示例所示),而不僅僅是^MyRoutine
(如第二個示例所示):
/// d ##class(PHA.TEST.Function).NAME6()
ClassMethod NAME6()
{
DO ##class(%SYSTEM.Process).RefInKind(0)
WRITE $NAME(^["PAYROLL"]MyRoutine)
}
DHC-APP> d ##class(PHA.TEST.Function).NAME6()
^["PAYROLL"]MyRoutine
/// d ##class(PHA.TEST.Function).NAME7()
ClassMethod NAME7()
{
DO ##class(%SYSTEM.Process).RefInKind(1)
WRITE $NAME(^["PAYROLL"]MyRoutine)
}
DHC-APP>d ##class(PHA.TEST.Function).NAME7()
^MyRoutine