使用无类型参数的单行方法调用

Single-line method calls with untyped parameters

我能否定义一个 ABAP 方法,其中 RETURNING 参数和任何 IMPORTING 参数具有通用类型,但仍然可以 在一行中作为功能方法调用?

换句话说,我想替换这个:

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = lv_external_value
    IMPORTING
      output = lv_internal_value.

有:

lv_internal_value= zcl_conversion=>alpha_input( lv_external_value ).

不幸的是,Class 方法不能有未类型化的 returning 参数,这使我无法将功能方法的 return 值声明为类型 ANYCLIKE。创建泛型方法参数的公认标准似乎是将它们定义为 TYPE REF TO DATA 和 dereference/assign。但据我所知,这阻止了我在单个语句中调用该方法 ,因为我必须首先分配导入参数,然后取消引用 returning 参数 ,导致与简单的 FM 调用相同或更多的代码行。

有解决办法吗?

不幸的是,除了使用取消引用运算符之外,没有其他方法取消引用数据,对于完整值段采用 ->* 形式,或者如果数据采用 ->comp 形式对象是结构化的并且有一个名为 comp 的组件(更糟糕的是,在 ABAP 代码中有很多地方你想使用来自取消引用的数据对象的值但由于内部原因不能这样做/语法限制)。

但是,您可以简单地将您的方法检索到的数据引用对象保存在调用代码的一个变量中,并使用该变量(而不是使用字段符号或取消引用值段本身的变量)。一般地,作为 ref to data 变量,或使用 CAST 运算符(新的 ABAP 语法)键入。

大多数可以用字段符号完成的事情,也可以直接用数据引用来完成。

示例:使用预期 return 类型的变量 result

data(result) = cast t000( cl=>m( ) ).
write result->mandt.

查看完整示例:

report zz_new_syntax.

class cl definition.
  public section.
    class-methods m returning value(s) type ref to data.
endclass.

start-of-selection.
  data(result) = cast t000( cl=>m( ) ).
  write: / result->mandt.  " Writes '123'.

class cl implementation.
  method m.
    s = new t000( mandt = '123' ).
  endmethod.
endclass.

在 ABAP NW Stack 7.4 上,您可以只使用参数类型 STRING,然后使用新的 CONV 运算符将您的实际输入转换为字符串。有点丑,但应该可以。

lv_internal_value = 转化率#(zcl_conversion=>alpha_input( 转化率#(lv_external_value) )).