多变量声明和初始化

Multi-variable declaration and initialization

假设我有一个带有几个导入参数的方法:

*"----------------------------------------------------------------------
*"  IMPORTING
*"     VALUE(iv_xx)  TYPE  xx
*"     VALUE(iv_xxx) TYPE  xxx
*"----------------------------------------------------------------------

我不想直接使用它们,因为在方法内部调试时我无法更改它们的值,而且可能还有更多原因。因此,我声明了我为其分配导入值的新变量。有很多方法可以做到这一点...

我是这样开始的:

DATA lv_xx  TYPE xx.
DATA lv_xxx TYPE xxx.

lv_xx  = iv_xx.
lv_xxx = iv_xxx.

继续:

DATA:
  lv_xx  TYPE xx,
  lv_xxx TYPE xxx.

lv_xx  = iv_xx.
lv_xxx = iv_xxx.

进化为:

DATA:
  lv_xx  LIKE iv_xx,
  lv_xxx LIKE iv_xxx.

lv_xx  = iv_xx.
lv_xxx = iv_xxx.

最近发现了一种更懒惰的方法:

DATA(lv_xx)  = iv_xx.
DATA(lv_xxx) = iv_xxx.

现在我想知道:
我可以更进一步,以某种方式消除 "DATA(...)" 重复吗?
我正在寻找类似

的内容
DATA( 
 lv_xx  = iv_xx
 lv_xxx = iv_xxx
).

我看到你的参数是按值传递,所以内核隐式地做了一个拷贝,不需要使用辅助变量。您还可以在调试时更改这些按值传递的参数(也许前段时间调试器中存在错误,但现在已经不存在了)。

因此,您可能只遇到参数 通过引用传递 的问题,因为它们被分配了一个 "read-only" 标志。

无论如何,要回答你的问题,一种可能是使用宏:

CLASS ltc_main DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS
      INHERITING FROM cl_aunit_assert.
  PRIVATE SECTION.
    METHODS test FOR TESTING.
    METHODS test2
      IMPORTING
        VALUE(iv_xx)  TYPE  i
        VALUE(iv_xxx) TYPE  i.
ENDCLASS.
CLASS ltc_main IMPLEMENTATION.
  METHOD test2.

    DEFINE mac_data.
      DATA(&1) &2 &3.
    END-OF-DEFINITION.

    mac_data :
      lv_xx  = iv_xx,
      lv_xxx = iv_xxx.

    assert_equals( act = lv_xx exp = 5 ).
    assert_equals( act = lv_xxx exp = 9 ).
  ENDMETHOD.

  METHOD test.
    test2( iv_xx = 5 iv_xxx = 9 ).
  ENDMETHOD.
ENDCLASS.

但就个人而言,我不会使用宏,我会声明每个辅助变量,如 DATA(lv_xx) = iv_xx

TYPES:
  BEGIN OF input_type,
    xx  TYPE xx,
    xxx TYPE xxx,
  END OF input_type.

DATA(input) = VALUE input_type( xx  = iv_xx
                                xxx = iv_xxx ).

和最终的废话。 ;-)

DEFINE mac_data.
  DATA(lv_&1) = iv_&2.
END-OF-DEFINITION.

mac_data : xx, xxx.