我可以定义一个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 ).
不幸的是,类方法不能具有无类型的返回参数这一事实阻止我将函数方法的返回值声明为类型ANY
或CLIKE
。创建通用方法参数的公认标准似乎是将它们定义为TYPE REF TO DATA
并取消引用/分配它们。但据我所知,这阻止我在单个语句中调用该方法,因为我必须先分配导入参数然后取消引用返回参数,从而产生相同或更多行代码一个简单的FM调用。
有解决方法吗?
答案 0 :(得分:4)
不幸的是,除了使用解除引用运算符之外,没有其他方法可以取消引用数据,无论是以->*
形式表示整个值段,还是以->comp
形式,如果数据对象是结构化,并有一个名为comp
的组件(更糟糕的是,在ABAP代码中有很多地方你想使用来自derefenced数据对象的值但是由于内部原因不能这样做/语法限制)。
但是,您可以简单地将方法检索的数据引用对象保存在调用代码的变量中,并使用该变量(而不是使用字段符号或变量用于derefenced值段本身)。通常使用ref to data
运算符(新的ABAP语法)作为CAST
变量或键入。
使用字段符号可以完成的大多数事情也可以直接使用数据引用来完成。
示例:使用预期返回类型的变量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.
答案 1 :(得分:1)
在ABAP NW Stack 7.4上,您可以使用参数类型STRING,然后使用新的CONV运算符将您的实际输入转换为字符串。有点丑,但应该工作。
lv_internal_value = CONV#(zcl_conversion => alpha_input(CONV#(lv_external_value)))。