第四十一章 Caché 函數大全 $NAME 函數 第四十一章 Caché 函數大全 $NAME 函數 大綱 描述 參數 示例 注意

第四十一章 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)。

擴展的全局引用

可以使用%SYSTEMRefInKind()方法控制$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  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章