FIELD SYMBOL和TYPE REF TO的用法和比较
2015-12-30 13:59
429 查看
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。
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。
相关文章推荐
- R语言中paste()中粘贴向量
- C语言struct内存占用问题
- java.lang.IllegalArgumentException: MALFORMED jar解析中文报错问题
- Grails 3.0连接Mysql数据库
- Java的接口与抽象类
- CMake 包含了头文件 找到了so动态库 链接时仍然出现undefined reference to 错误
- [LeetCode]题解(python):086-Partition List
- Git CMD - clone: Clone a repository into a new directory
- iOS UITableView 便捷编写
- docker 简介
- JavaScript阻止回车提交表单的方法
- iOS视图控制对象生命周期的区别
- 【Android 开发】Android App 内存泄露之Handler
- 在一个apk中调用另外一个apk中的activity
- 文件上传漏洞
- KindEditor修改图片上传
- 从豆瓣电影评分算法说起
- 为什么说我们已经进入注意力经济时代
- js封装的一个menu,以备参考
- Android:活动的启动模式