欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

FIELD SYMBOL和TYPE REF TO的用法和比较(->*)

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 > 是比较内存里的值,相对应的是IF ref1->* = ref2->*,而不能判断比较IF ref1 = ref2。

 

转自:https://blog.csdn.net/fengyan5022/article/details/50434230

posted @ 2020-03-20 14:52  萧静默  阅读(545)  评论(0编辑  收藏  举报