当前位置: 首页 > 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.gsyq.cn/news/1616005.html

相关文章:

  • 当灯光“躲”进陪伴机器人:智能照明的隐藏式进化与异业合作新浪潮
  • 从零到一:在STM32上跑通TinyML的完整实践指南
  • 哔哩下载姬完整指南:告别网络焦虑,轻松掌控B站视频资源
  • 工业4-20mA电流环设计:DAC161S997与PIC32实战解析
  • HarmonyOS7 缓存不是越多越好:图片、数据、视图多层缓存策略这样定
  • VSCode JSON 样式
  • 2026年6月份化工储存用玻璃钢储罐,源头生产企业该如何筛选
  • 亿俐缇国际物流(YLT GLOBAL)——中东双清包税门到门物流服务的优势与特点
  • Spring Cloud Alibaba 生产级实战:16 个模块覆盖全栈微服务
  • 亲测有效:瑜伽缓解腰痛的南湖实践分享
  • 预约小程序怎么搭建?全球5款工具实测:餐宝盈/BBWEYY/比文云/Brizy/PageXL(2026年7月更新),含零代码SAAS、AI编程、源码定制交付
  • STC3115+PIC18F97J94电池监控系统设计与优化
  • 四个看不见的成本漏洞,系统一个一个帮你堵上
  • HarmonyOS7 购物车看着简单最容易翻车:增删改、全选、价格计算一篇讲透
  • 云尖信息参编《Token驱动智能经济研究报告》正式发布
  • 恶意软件窃取 Chrome 会话 Cookie 的攻击机制与防御研究
  • CVE-2025-12108漏洞应急响应实战:从情报研判到深度防御的完整指南
  • AI写了60%的代码,你的研发周期却没变短?问题不在AI,在你对“写代码”的理解
  • 如何在Mac上实现优雅的桌面歌词显示:LyricsX完全指南
  • Trae界面闪烁?一招禁用GPU硬件加速轻松搞定!
  • 微信聊天记录删了别乱找!官方全套恢复方法,无备份也能救
  • 使用无障碍技术实现自动化脚本
  • 告别部署报错!OpenClaw 2.7.9 Win11超稳安装配置全流程
  • Nuke Survival Toolkit:150个专业插件打造高效合成工作流
  • 从消费决策变化看信息透明化的商业价值
  • 分层实验智能体(HExA):基于上下文自演化物理推理智能体框架
  • 如何选择靠谱的装修公司?从泰美空间设计合作案例看筛选标准
  • SQL优化_监管指标计算性能全维度优化方案
  • GEO 是什么?从 “关键词匹配” 到 “AI 信任” 的营销革命
  • 三明 开店扫码点餐系统到底要花多少钱?别被坑了才知道!