Type Ref To(以下簡稱:TRT)和 Field Symbol(以下簡稱:FS)在 ABAP 中都有着類似指針的作用;
下面結合對比和實例來介紹下兩者的用法和區別之處。
先預定義類型ty_ym,內表it_ym,工作區wa_ym,變量v_ym(char20)以供後面使用:
一、定義
Type Ref To 和Field Symbol 的定義都可以指定特定的類型或者結構,或者不指定。
DATA ref TYPE REF TO data. "不指定特定類型或者結構,可以是結構也可以是類型
DATA ref TYPE REF TO ty_ym. "指定特定結構
DATA ref TYPE REF TO char20. "指定特定類型
FIELD-SYMBOLS < FS > TYPE ANY TABLE."任意標準表
FIELD-SYMBOLS < FS > TYPE it_ym. "指定特定的表
FIELD-SYMBOLS < FS > TYPE any. "不指定特定類型或者結構,可以是結構也可以是類型
FIELD-SYMBOLS < FS > TYPE ty_ym. "指定特定結構
FIELD-SYMBOLS < FS > TYPE char20. "指定特定類型
二、初始化
Type Ref To 有兩種初始化的方法:
第一種是用 CREATE DATA 動態開闢內存;
第二種是用 GET REFERENCE OF 指向已經存在的內存變量.
Field Symbol 的初始化,則只能指向已經存在的內存變量。
CREATE DATA ref TYPE ty_ym.
CREATE DATA ref LIKE LINE OFit_ym.
CREATE DATA ref LIKE wa_ym.
CREATE DATA ref LIKE ym.
如果定義 ref 是指定特定的類型或者結構的,那麼 CREATE DATA 時 TYPE 可以省略。
無論定義時 ref 是否有特定的類型或者結構,CREATEDATA 時必須指定特定的類型或者結構,不能是data這種泛型的。
ASSIGN wa_ym TO < fs >."Field Symbol的初始化,效果相當於指向wa_ym
ASSIGN v_ym TO < fs >. "Field Symbol的初始化,效果相當於指向v_ym
GET REFERENCE OF wa_ym INTO ref. "TypeRef To的初始化,效果相當於指向 wa_ym
GET REFERENCE OF v_ym INTO ref. "Type Ref To的初始化,效果相當於指向 v_ym
在使用 Field Symbol 和 Type Ref To 前必須初始化,不然會發生 RUNTIMEERROR。
三、使用
如果第一步定義時指定了特定的類型或者結構,那麼 Field Symbol 和 Type Ref To 都可以直接使用;
如果第一步定義時沒有指定類型或者結構,那麼 Type Ref To 必須 ASSIGN 到另外一個 Field Symbol 裏間接使用。
1)指定特定的類型時:
ref->* = 'abc'.
< fs > = 'abc'.
2)指定特定的結構時:
ref->*-col1 = 'abc'. "簡寫是ref->col1
< fs >-col1 = 'abc'.
3)不指定特定的類型或者結構時:
FIELD-SYMBOLS < FSX >TYPE ty_ym
ASSIGN ref->* TO < FSX>. "泛用型結構
< FSX >-col1= 'abc'.
FIELD-SYMBOLS < FSX >TYPE any. "
ASSIGN ref->* TO < FSX>. "泛用型類型
< FSX > = 'abc'.
FIELD-SYMBOLS < FSX >TYPE any. "
ASSIGN COMPONENT 'col1' OFSTRUCTURE < FS > INTO < FSX >. "泛用型結構
< FSX > = 'abc'.
注意事項:
一般來說爲了使用方便,還是應該指定 Field Symbol 或者 Type Ref To 的類型或者結構,以便之後直接使用。
在使用 Type Ref To 時,如果是 TYPE REF TO DATA,那麼之後想使用這個 Type Ref To 時,依然會不可避免的用到 FieldSymbol;
這樣代碼寫起來就很麻煩,還不如一開始就使用 Field Symbol 寫。
但像動態內表這種事先不知道結構的場合,那麼只能使用 Type Ref To,再結合 Field Symbol;
如果直接使用 Field Symbol,那麼 Field Symbol 將無法參考某個已經存在的結構進行初始化。
第一步假如 TYPE REF TO DATA,後面的第二步初始化時依然要指定特定的結構,所以還不如第一步就指定結構。
建議只有在事先不知道結構時,才使用泛型定義。
所以要麼定義和初始化時都指定類型或者結構,要麼就是動態內表或者結構都無法在事先指定;
像第一步 TYPE REF TO DATA 第二步CREATE DATA ref TYPE ty_ym 不是好的做法。
4、區別
Type Ref To 和 Field Symbol 在用法上目前發現的主要區別:
1)Type Ref To 可以動態開闢內存,在動態內表時,可以等在程序運行時獲得結構後再開闢內存,並且賦值給某個 Field Symbol。而光用 Field Symbol 是做不到的,因爲 Field Symbol 的初始化需要“掛”在已知結構上。
2)TypeRef To 不像 Field Symbol 那樣有LOOP AT it_tabASSIGNING < fs >的寫法,ref->*不是指向內表數據,而是類似工作區指向某塊內存,所以更改數據後需要 modify 到內表,如果不需要數據了要clear。
而 Field Symbol 則不需要考慮 modify 和 clear。
3)IF< fs1 > = < fs2 > 是比較內存裏的值,相對應的是IFref1->* = ref2->*,而不能判斷比較 IF ref1 = ref2。