Проверка соответствия типа Эйфеля и прикрепления не работает

Попытка решить одно из последствий SCOOP с помощью make_from_separate Я столкнулся с проблемой, когда во время выполнения типы кажутся одинаковыми и не передают attached заявление.

non_separate_from_any

non_separate_from_any, any_from_separate (v: separate ANY): ANY
    local
        l_array: ARRAY[detachable ANY]
        l_res_ll_arr_det_any: LINKED_LIST[ARRAY[detachable ANY]]
        l_arr_det_str: ARRAY[detachable STRING]
    do
        if
            attached {REAL} v as l_v
        then
            Result := l_v
        elseif attached {separate INTEGER_32_REF} v as l_v then
            Result := l_v.as_integer_32
        elseif attached {INTEGER} v as l_v then
            Result := l_v
        elseif attached {separate STRING} v as l_v then
            create {STRING} Result.make_from_separate (l_v)
        elseif attached {separate STRING_32} v as l_v then
            create {STRING_32} Result.make_from_separate (l_v)
        elseif attached {separate LINKED_LIST[separate ARRAY[detachable ANY]]} v as l_v then
            create l_res_ll_arr_det_any.make
            across
                l_v is l_list_item_sep
            loop
                create l_array.make_empty
                separate l_list_item_sep as l_list_item_sep_tmp do
                    across
                        l_list_item_sep_tmp as l_array_item_non_sep
                    loop
                        if attached l_array_item_non_sep as l_any_sep then
                            l_array.put (non_separate_from_any (l_any_sep), l_array_item_non_sep.cursor_index)
                        else
                            l_array.put (Void, l_array_item_non_sep.cursor_index)
                        end
                    end
                end
                l_res_ll_arr_det_any.extend (l_array)
            end
            Result := l_res_ll_arr_det_any
        elseif attached {separate ARRAY[detachable STRING]} v as l_v then
            create l_arr_det_str.make_empty
            across
                l_v as l_s_sep
            loop
                if attached l_s_sep.item as l_s_sep_att then
                    l_arr_det_str.put (create {STRING}.make_from_separate (l_s_sep_att), l_s_sep.cursor_index)
                else
                    l_arr_det_str.put (Void, l_s_sep.cursor_index)
                end
            end
            Result := l_arr_det_str
        else
            check
                implement_me: False
            then
                do_nothing
            end
        end
    ensure
        instance_free: Class
    end

Переменные и утверждения со снимком экрана

ОБНОВЛЕНИЕ 20200616

Заявления следующие:

DB_TUPLE_COL_NAMES -> items: ARRAY[STRING]
DEFAULT_DB_ACTION -> column_names: separate like {DB_TUPLE_COL_NAMES}.items


DEFAULT_DB_ACTION -> make_from_separate (other: separate like Current)

Во время выполнения я получил other.column_names -> at runtime: ARRAY[detachable STRING]

Как это может быть!!! это причина моей реализацииany_from_separate с l_arr_det_str

2 ответа

Похоже, что реальный тип объекта ARRAY [detachable STRING] скорее, чем ARRAY [STRING].

TL;DR:

+ Изменить

        elseif attached {separate LINKED_LIST[separate ARRAY[detachable ANY]]} v as l_v then
            create ll_arr_det_any.make -- l_arr_det_str: ARRAY[detachable STRING]

с участием

        elseif attached {separate LINKED_LIST[separate ARRAY[detachable ANY]]} v as l_v then
            create l_arr_str.make -- l_arr_det_str: ARRAY[STRING]

Объяснение

Моя ошибка была в {SCOOP_UTIL}.any_from_separate.

В качестве

{separate LINKED_LIST[separate ARRAY[ANY]]}

соответствует

{separate LINKED_LIST[separate ARRAY[detachable ANY]]}

он шел по этому пути, и я понял, что должен создать

ARRAY[detachable ANY] но был ARRAY[ANY].

Другие вопросы по тегам