当前位置: 首页 > news >正文

ABAP :新语法 - REF

REF是ABAP中构造函数表达式的组成部分,属于内置的构造函数运算符

它的核心作用是:

在操作数位置构造一个指向数据对象的引用,或控制表表达式(table expression)的结果

与其他构造函数运算符(如NEWCASTVALUE等)不同,REF的结果始终是一个数据引用变量(data reference variable)。


语法:REF type ( dobj ) | ( table_exp )

REF type( dobj )—— 取数据对象的引用

当参数是一个数据对象(dobjdata object)时,创建一个指向该数据对象的引用变量

关于type(静态类型)的确定

  • 可以指定非泛型数据类型dtype,需遵循引用变量的向上转型规则。

  • 可以指定泛型类型data

  • 可以指定#,由编译器按以下优先级自动推导:

    1. 如果操作数位置所需的数据类型是唯一且完全已知的,使用该类型;

    2. 如果无法从上下文推导,使用dobj本身的类型;

    3. 如果dobj的类型在静态上未知,则使用泛型data

案例:获取内表引用并赋值

TYPES pict_line(1022) type x. DATA pict TYPE STANDARD TABLE OF pict_line WITH EMPTY KEY. DATA ext_data TYPE cl_abap_browser=>load_tab. ext_data = VALUE #( ( name = 'PICT_GIF' type = 'image' dref = REF #( pict ) ) ).

解析REF #( pict )创建了一个指向内表pict的数据引用,并将其赋值给ext_datadref组件。这里没有复制pict的数据,只传递了引用(地址),避免了大数据量的拷贝。

案例:获取结构体地址并赋值

TYPES: BEGIN OF lty_data, matnr TYPE mara-matnr, mtart TYPE mara-mtart, matkl TYPE mara-matkl, text1 TYPE char50, END OF lty_data. DATA(lwa_data) = VALUE lty_data( matnr = 'MATERIAL-001' mtart = 'FOOD' matkl = '1010' text1 = 'FIRST' ). DATA(lv_ref) = REF #( lwa_data ). lv_ref->* = VALUE #( matnr = 'MATERIAL-002' mtart = 'FOOD' matkl = '1010' ). cl_demo_output=>display( lwa_data ). lv_ref->text1 = 'SECOND'. cl_demo_output=>display( lwa_data ).

测试结果:


REF type( table_exp )—— 控制表表达式的结果

当参数是一个表表达式(table expression)时,REF的作用是控制表表达式的结果类型——使其返回一个指向查找到的内表行的临时数据引用变量,而不是工作区或字段符号。

案例:获取内表特定行的引用

DATA itab TYPE STANDARD TABLE OF i WITH EMPTY KEY. itab = VALUE #( FOR i = 1 UNTIL i GE 10 ( i * 10 ) ). DATA(dref1) = REF #( itab[ 5 ] ). " 如果找不到第15行,返回指向 999 的引用,不会抛出异常 DATA(dref2) = REF #( itab[ 15 ] DEFAULT REF #( 999 ) ). cl_demo_output=>display( dref1->* ). cl_demo_output=>display( dref2->* ).

实战案例1:在方法调用中直接传递引用。

CLASS lcl_demo DEFINITION. PUBLIC SECTION. METHODS test_ref IMPORTING ir_data TYPE REF TO data. ENDCLASS. CLASS lcl_demo IMPLEMENTATION. METHOD test_ref. ASSIGN ir_data->* TO FIELD-SYMBOL(<fs_data>). WRITE:/,<fs_data>. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA lv_string TYPE string VALUE `测试测试`. SELECT SINGLE * INTO @DATA(lw_makt) FROM makt. NEW lcl_demo( )->test_ref( REF #( lv_string ) ). NEW lcl_demo( )->test_ref( REF #( lw_makt ) ).

解析#是类型占位符,编译器会根据上下文自动推导数据类型。如果上下文无法推导,则使用dobj本身的类型。


实战案例:向上转型(Upcast),安全、自动化的“泛化”。向上转型是指将类型更具体的引用赋值给类型更通用(或相同)的引用变量

方向:具体类型 → 通用类型。这好比说“这只狗(具体)是一只动物(通用)”,逻辑上是完全安全的。

向上转型的场景:

将完全类型化的数据引用赋值给泛型类型REF TO data的变量

在面向对象中,将子类引用赋值给父类应用。

简单demo:

DATA lv_num TYPE i VALUE 99. DATA(lv_specific) = REF #( lv_num ). DATA lv_generic TYPE REF TO data. "向上转型:将具体的I类型变量 赋值给 通用的DATA类型引用 lv_generic = lv_specific. ASSIGN lv_generic->* to FIELD-SYMBOL(<fs_data>). WRITE:<fs_data>.

实战案例:向下转型 (Downcast):危险、需显式的“特化”,向下转型是指将类型更通用的引用,赋值给类型更具体(或相同)的引用变量

方向:通用类型 → 具体类型。这好比说“这只动物(通用)是一只狗(具体)”,逻辑上不一定成立(它可能是一只猫),因此是危险的。

向下转型的场景:将泛型REF TO data的引用,向下转型回具体的类型。

运行时检查和异常:向下转型的语法检查是允许的(因为有?=),但真正的类型检查发生在程序运行时。转型不成功,SAP将会抛出一个可捕获的异常,并且目标变量保持其原有值不变。

" 安全的向下转型 IF lv_generic IS INSTANCE OF TYPE i. " 检查通过,可以安全转型 DATA(lv_specific) = CAST #( lv_generic ). ELSE. " 处理类型不匹配的情况 ENDIF.
http://www.jsqmd.com/news/1104032/

相关文章:

  • 编写自动化脚本时使用多线程技术
  • LangChain4j Guardrails:给你的 AI Service 装上输入输出双层卡口
  • Windows10上安装MySQL操作步骤
  • 纯小白零基础漏洞挖掘完整教程,从理论到实操一步到位,看完即可上手提交漏洞拿赏金
  • 论文格式改 3 遍还不合格?笔墨 AI 一键匹配院校模板,不用手动调半天
  • 多场景学术写作一站式解决方案,paperxie 智能论文写作功能拆解实测
  • 使用JMeter进行gRPC微服务性能测试的完整指南
  • 优化数据库查询性能的五个实用技巧
  • 哔哩下载姬完整指南:告别网络焦虑,轻松掌控B站视频资源
  • 简单聊一下JAX
  • 3个关键突破:如何用dnSpyEx解决.NET逆向工程的核心痛点?
  • 工业4-20mA电流环设计:DAC161S997与PIC32实战解析
  • 工业清洁机器人智能化应用与厂区使用优势
  • Mac远程控制Windows电脑的两种方法
  • 论文选题总是太宽泛?笔墨 AI 前置引导锚定研究边界,从源头避免跑偏
  • 示波器基础:从探头补偿到SPI总线解码实战——触发、解码、测量
  • HarmonyOS7 缓存不是越多越好:图片、数据、视图多层缓存策略这样定
  • 核聚热爱,竞力向上!爱攻AGON亮相2026核聚变游戏嘉年华
  • HarmonyOS7 插件化怎么做才真能热插拔?动态加载架构拆开讲
  • 松江厂房出租企业哪家专业
  • CCF-GESP计算机学会等级考试2026年6月二级C++T2 菱形
  • bug 记录 - 字符加粗导致宽度变化抖动问题
  • CRMEB Pro 订单二开避坑:为什么商品页和下单页的价格会不一致?
  • VSCode JSON 样式
  • 纳米级定位的“最后一公里”:压电运动控制器三大驱动架构对比与算法选型实测(2026)
  • 二值信号量 vs 互斥量(Mutex)核心区别
  • 2026年AI论文工具盘点:12款神器助你高效完成开题写作、改稿和答辩
  • 本地电脑也能玩 AI,Ryzen AI 搭配 Ollama 快速上手教程
  • 高效Zotero笔记管理:用Mdnotes插件将学术文献秒变Markdown
  • 办公场景自动化 OpenClaw 实操教学,图形界面完成整套智能体部署(含安装包)