共計 2036 個字符,預計需要花費 6 分鐘才能閱讀完成。
行業資訊
服務器
ABAP 關鍵字 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 怎么使用
本篇內容主要講解“ABAP 關鍵字 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“ABAP 關鍵字 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 怎么使用”吧!
ABAP 里的 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 這組關鍵字,如果平時不留心,很容易理解地似是而非。今天我們就來說一說它們的區別。
先把 SAP 幫助文檔抄過來:
IS BOUND
It checks whether a reference variable contains a valid reference. A data reference variable that contains a stack reference, on the other hand, can become invalid even if the reference data object is removed from the stack.
IS INITIAL
checks whether the operand operand is initial. The expression is true, if the operand contains its type-friendly initial value.
IS ASSIGNED
checks whether a memory area is assigned to a field symbol. The expression is true if the field symbol points to a memory area.
簡單翻譯成中文:
IS BOUND:用于檢查一個引用變量是否指向了一個有效的引用。幫助文檔特意提到,如果一個引用指向的是一個棧上申請的變量,那么這個變量會隨棧的銷毀而被銷毀,因此指向其的引用不再有效。
IS INITIAL: 用于檢查一個變量的值是否為其數據類型對應的初始值。
比如我定義一個引用變量但不對其賦值,則 IS INITIAL 判斷一定為 abap_true.
IS ASSIGNED: 對于檢測的 field symbol,該關鍵字判斷該 field symbol 是否分配有內存區域。
這三個關鍵字交織在一起,就形成了一些有趣的排列組合。
比如,是否存在 NOT INITIAL, 但同時也 NOT BOUND 的變量?是否存在同時滿足 IS INITIAL, NOT BOUND 和 IS ASSIGNED 的 field symbol? 下面我們用一個簡單的 ABAP 報表來研究這些排列組合。
完整的測試代碼:
同時滿足 NOT INITIAL 和 NOT BOUND 的引用變量
下圖 main 方法里,第 15 行在棧上定義了一個整型變量 number,將其引用賦給類的成員變量 dref. 待 main 方法執行之后,number 所生存的棧幀被銷毀,因此 dref 指向的引用不再有效,調試器里顯示為:FREED STACK.
現在 dref 并不是未指向任何引用,而是指向一個無效的引用,因此 dref 同時滿足 IS NOT INITIAL 和 IS NOT BOUND.
IS ASSIGNED
一個 field symbol 定義之后,如果不為其分配內存區域,則 IS ASSIGNED 返回 abap_false.
下面的代碼,如果注釋掉第 27 行的 IF 條件:
運行時會拋出 GETWA_NOT_ASSIGNED 錯誤:Field symbol has not yet been assigned.
也就是說,無論是讀取 field symbol 具體的內容,還是檢測其內容是否為初始值,為了避免 GETWA_NOT_ASSIGNED 錯誤,我們必須在 IS INITIAL 判斷之前,使用 IS ASSIGNED 判斷 field symbol 是否被分配了內存區域。
是否存在一個 NOT BOUND, IS INITIAL 但是卻 IS ASSIGNED 的 field symbol?
答案是肯定的。
上面代碼第 37 行定義的名為 any2 的 field symbol,在第 45 行的 CLEAR 操作完成之后,就同時滿足這三個條件。這個 field symbol 被分配的內存區域,內容并不是整型數本身,而是一個指向整型變量的引用。
該報表打印輸出如下:
第 40 行代碼通過 ASSIGN 分配給 any2 的內存區域并未通過 UNASSIGN 釋放,因此 any2 IS ASSIGNED 始終返回 abap_true. 另一方面,這塊內存區域雖然還未釋放,但里面存放的引用變量已經不再指向任何一個有效的變量了,因此 IS BOUND 返回 abap_false. 最后,因為 any2 施加了 CLEAR 操作, 又回到了初始化狀態,所以 IS INITIAL 返回 abap_true.
到此,相信大家對“ABAP 關鍵字 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!