Возвращаемые параметры встроенного метода разыменования - PullRequest
3 голосов
/ 05 февраля 2020

Я видел несколько стандартных методов 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 )->*.

К сожалению, это не работает, потому что:

Тип результата функционального метода «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>.

Это выглядит как массивная операция для простого действие.

1 Ответ

5 голосов
/ 05 февраля 2020

Метод GET_MAX_VALUE возвращает переменную с типом TYPE REF TO DATA, которая является «ссылкой на тип данных c».

Вы не можете разыменовать ссылки * generic c (*).

Однако вы можете сначала CAST их, чтобы ABAP узнал о конкретном типе данных, а затем разыменовать результат (теперь типизированный) результата приведения.

DATA lv_max_value TYPE i.
lv_max_value = CAST i( cl_abap_exceptional_values=>get_max_value( lv_max_value ) )->*.

(*) В документации TYPES - REF TO говорится, что только ссылки на полные типы данных могут быть разыменованы:

Переменная ссылки на данные, набранная полностью с TYPE REF TO complete_type или LIKE REF TO dobj может быть разыменовано во всех совпадающих позициях операнда с помощью оператора разыменования -> *. Если тип данных stati c структурирован, селектор компонентов объекта обеспечивает доступ к компонентам структуры с помощью dref-> comp.

, а в этой документации объясняется, что complete тип данных "Тип данных, который не является универсальным c."

...