You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FOR表达式中使用REF出现异常行为的原因咨询

为什么ABAP FOR表达式生成的引用全指向最后一个值?

你的代码如下:

DATA(t_strings) = VALUE char10_t( ( 'S1' ) ( 'S2' ) ( 'S3' ) ).

TYPES : BEGIN OF gty_ref,
         string_ref TYPE REF TO data,
       END OF gty_ref,

       gty_t_ref TYPE STANDARD TABLE OF gty_ref.

DATA : t_string_ref1 TYPE gty_t_ref,
       t_string_ref2 TYPE gty_t_ref.

t_string_ref1 = VALUE #( FOR entry IN t_strings ( string_ref = REF #( entry ) ) ).

LOOP AT t_strings ASSIGNING FIELD-SYMBOL(<entry>).
  t_string_ref2 = VALUE #( BASE t_string_ref2 ( string_ref = REF #( <entry> ) ) ).
ENDLOOP.

核心原因

两段代码的差异在于变量的内存复用逻辑:

  • FOR表达式中的entry是一个一次性初始化的局部变量,整个循环过程中只会占用一块内存。每次迭代只是把当前表项的值覆盖到这个变量里,所以REF #( entry )每次取的都是同一块内存的地址。循环结束后,这个变量的值是最后一个表项'S3',因此所有引用都指向它。
  • LOOP里的<entry>是字段符号,它直接绑定到t_strings表中当前迭代元素的内存地址。每次循环<entry>指向的是表中不同位置的元素,所以REF #( <entry> )取的是每个表项各自的内存地址,最终每个引用都对应正确的元素。

修复FOR表达式的写法

如果想用FOR表达式生成正确的独立引用,需要每次迭代创建新的局部变量,避免内存复用:

t_string_ref1 = VALUE #( FOR entry IN t_strings 
                         DATA(lv_temp) = entry  " 每次迭代新建变量
                         ( string_ref = REF #( lv_temp ) ) ).

这样每个lv_temp都是独立的内存空间,对应的引用自然指向各自的表项值。

内容的提问来源于stack exchange,提问作者mmgro27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:05:20