Zer*_*ero 3 abap return-value dereference
我见过几个 ABAP 标准方法,它们返回对数据的引用作为结果。
CL_ABAP_EXCEPTIONAL_VALUES=>GET_MAX_VALUE( )是其中一种方法。我的自然倾向是在一行中使用此方法,如下所示:
DATA lv_max_value TYPE i.
lv_max_value = CL_ABAP_EXCEPTIONAL_VALUES=>GET_MAX_VALUE( lv_max_value )->*.
Run Code Online (Sandbox Code Playgroud)
可悲的是,这不起作用,因为:
功能方法“GET_MAX_VALUE”的结果类型不是对象引用或接口引用。
手头的问题是:是否可以直接取消引用这些结果?
每当我确定结果是兼容的时,我宁愿避免取消引用的旧方法(存储引用,将其分配给字段符号,然后将其放入目标变量):
DATA lv_max_value TYPE i.
DATA ref TYPE REF TO data.
FIELD-SYMBOLS <field> TYPE any.
ref = CL_ABAP_EXCEPTIONAL_VALUES=>GET_MAX_VALUE( lv_max_value ).
ASSIGN ref->* TO <field>.
lv_max_value = <field>.
Run Code Online (Sandbox Code Playgroud)
这似乎是一个简单动作的大规模操作。
该方法GET_MAX_VALUE返回一个类型化的变量TYPE REF TO DATA,它是“对通用数据类型的引用”。
您不能取消引用泛型引用 (*)。
但是,您可以先使用CAST它们,让 ABAP 了解具体的数据类型,然后取消引用转换的(现在已键入的)结果。
DATA lv_max_value TYPE i.
lv_max_value = CAST i( cl_abap_exceptional_values=>get_max_value( lv_max_value ) )->*.
Run Code Online (Sandbox Code Playgroud)
(*) TYPES - REF TO的文档说只有对完整数据类型的引用才能被取消引用:
使用取消引用运算符 ->* 在所有匹配的操作数位置中使用
TYPE REF TO complete_type或LIKE REF TO dobj可以取消引用完整类型的数据引用变量。如果静态数据类型是结构化的,对象组件选择器允许使用 dref->comp 访问结构的组件。
并且本文档解释了完整的数据类型是“非通用的数据类型”。