Type Ref To(以下简称:TRT)和 Field Symbol(以下简称:FS)在 ABAP 中都有着类似指针的作用;

下面结合对比和实例来介绍下两者的用法和区别之处。

先预定义类型ty_ym,内表it_ym,工作区wa_ym,变量v_ym(char20)以供后面使用:

一、定义

Type Ref To 和 Field Symbol 的定义都可以指定特定的类型或者结构,或者不指定。

二、初始化

Type Ref To 有两种初始化的方法:

第一种是用 CREATE DATA 动态开辟内存;

第二种是用 GET REFERENCE OF 指向已经存在的内存变量.

Field Symbol 的初始化,则只能指向已经存在的内存变量。

如果定义 ref 是指定特定的类型或者结构的,那么 CREATE DATA 时 TYPE 可以省略。

无论定义时 ref 是否有特定的类型或者结构,CREATE DATA 时必须指定特定的类型或者结构,不能是data这种泛型的。

在使用 Field Symbol 和 Type Ref To 前必须初始化,不然会发生 RUNTIME ERROR。

三、使用

如果第一步定义时指定了特定的类型或者结构,那么 Field Symbol 和 Type Ref To 都可以直接使用;

如果第一步定义时没有指定类型或者结构,那么 Type Ref To 必须 ASSIGN 到另外一个 Field Symbol 里间接使用。

1) 指定特定的类型时:

1
2
ref ->* = 'abc'.
<fs> = 'abc'.

2) 指定特定的结构时:

1
2
ref->*-col1 = 'abc'.  "简写是ref->col1
< fs >-col1 = 'abc'.

3) 不指定特定的类型或者结构时:

注意事项:

一般来说为了使用方便,还是应该指定 Field Symbol 或者 Type Ref To 的类型或者结构,以便之后直接使用。

在使用 Type Ref To 时,如果是 TYPE REF TO DATA,那么之后想使用这个 Type Ref To 时,依然会不可避免的用到 Field Symbol;

这样代码写起来就很麻烦,还不如一开始就使用 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)Type Ref To 不像 Field Symbol 那样有LOOP AT it_tab ASSIGNING < fs >的写法,ref->*不是指向内表数据,

而是类似工作区指向某块内存,所以更改数据后需要 modify 到内表,如果不需要数据了要clear。

而 Field Symbol 则不需要考虑 modify 和 clear。

3)IF < fs1 > = < fs2 > 是比较内存里的值,相对应的是IF ref1->* = ref2->*,而不能判断比较 IF ref1 = ref2 。

FIELD SYMBOL和TYPE REF TO的用法和比较相关推荐

  1. 【ABAP】Field Symbol使用总结

    Field Symbol(以下简称FS),主要作用是程序更加灵活,有时可以实现一般做法无法实现的功能,比如动态ALV内表,LOOP时使用FS还可以提高程序效率.FS缺点是影响程序可读性,为修改和维护代 ...

  2. 什么是 ABAP Field Symbol

    ABAP Field Symbol 是 ABAP 这门编程语言一个比较重要的语言特性.在 ABAP 帮助文档里的介绍: 在我十几年前刚刚开始学习 ABAP 时,阅读这段帮助文档的文字,觉得比较晦涩. ...

  3. 编译报错field has incomplete type

    linux下编译C++代码报错,报错信息"field has incomplete type".这种问题一般都是在头文件对类或者结构体进行了前向声明,后面使用了该类定义了对象,导致 ...

  4. 程序编译是出现“field has incomplete type“问题的解决

    程序编译是出现"field has incomplete type"问题的解决 参考文章: (1)程序编译是出现"field has incomplete type&qu ...

  5. ES插入date类型数据报错failed to parse field [case_date] of type [date]

    ES插入date类型数据报错 mapping信息如下 {"mappings": {"_doc": {"properties": {" ...

  6. java.lang.NoSuchFieldError: No static field ib_back of type I in class Lcom/example/demo/R$id; or

    多Module模式findViewById报错: java.lang.NoSuchFieldError: No static field ib_back of type I in class Lcom ...

  7. java.lang.NoSuchFieldError: No static field id_sl_hlry of type I in class Lcom/bsoft/mob/common/R$id

    多 module 项目 findViewById 时候报错: java.lang.NoSuchFieldError: No static field id_sl_hlry of type I in c ...

  8. 【我的Android进阶之旅】异常:java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/xxx/R$id;

    文章目录 一.问题描述 二.分析问题 2.1 android是怎么根据id查找到控件的 2.2 继续分析问题 2.3 分析layoutId 2.4 分析R.java 文件 2.5 根本原因 2.6 重 ...

  9. java.lang.NoSuchFieldError: No static field xxxx of type I in class Lcom/app/live/R$id; or its supe

    这个问题一般是在组件化项目(我这里有一个组件化项目,文末有链接)中出现的,其实就是组件化资源名冲突问题:就是Android 两个模块layout文件同名时出现 NoSuchFieldError报错的问 ...

最新文章

  1. weblogic学习笔记(1)
  2. 当 AI 开始“入侵”人类
  3. Linux 查看命令路径 以及相关信息
  4. 什么是事务、事务的四个特性ACID、不考虑隔离性会导致的三个问题、四种隔离级别
  5. unity 是厘米还是米_身高差45厘米! 这对重庆小情侣拍短视频晒幸福火了
  6. spring boot web_SpringBoot2.x入门:引入web模块
  7. 利用sdkman安装kotlin和java环境
  8. cygwin--简单备忘
  9. PN序列的产生以及相关函数的计算
  10. (附源码)计算机毕业设计ssm大学生网络安全题库系统
  11. qt 二维数组初始化_C++数组初始化方法
  12. 广告商业形态与应用架构
  13. 力扣报错 error: <identifier> expected
  14. 蚂蚁区块链第9课 SSL/TLS工作原理及在蚂蚁BAAS中的应用
  15. 训练神经网络gpu占用率低,外接gpu 训练神经网络
  16. 哔咔漫画怎样切换横屏?
  17. RN TSX基于react-native-vector-icons和iconfont.cn 的生成自定义Icon组件的工具
  18. GO 编程模式学习笔记——GO GENERATION
  19. GripSeal格雷希尔G80系列内螺纹快速接头的使用方法 G80L-M10 M12
  20. week3-day7 某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张,且每种票子至少一张。问:有几种换法?

热门文章

  1. 如何增加儿童产品中的趣味性?
  2. 利用「接口」做产品时我们该如何思考?
  3. 别研究买房了,墓地你研究过吗?
  4. Spark算子总结版
  5. 英佩臻游联手发力《全球使命VR》突显未来野心
  6. C 语言的实际运用 ---150809124
  7. Android开发之 当前日期String类型转date类型 java代码中实现方法
  8. PLS-00172: string literal too long
  9. Web(浏览器)打开运行WinForm应用程序
  10. 使用EL表达式接收url的传值