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
相关产品推荐
相关产品推荐

