Общее преобразование в целое число в Eiffel

У меня есть несколько кодов, например:

keys: LINKED_LIST[K]
...
test
local
    tempK:K
    tempI:INTEGER
do
...
across
    keys as cursor
loop
    tempK := cursor.item
    if tempK ~ 1 then
       tempI := tempK
    end
end
...
end

"cursor.item" имеет тип "K". Однако реальное значение внутри имеет целочисленный тип.

таким образом, "если tempK ~ 1, то" работает нормально. Но "tempI := tempK" не работает.

Как я могу преобразовать тип K tempK в целое число? чтобы он мог компилироваться?


person Miku    schedule 27.10.2017    source источник


Ответы (1)


В этом конкретном случае, когда вы знаете, что tempK равно 1, подойдет tempI := 1.

Если идея состоит в том, чтобы инициализировать tempI, как только значения, хранящиеся в списке, имеют тип INTEGER, есть несколько способов. Один из них - использовать объектный тест:

if attached {INTEGER} tempK as i then
    tempI := i
end

Однако в этом случае проверка проводится для каждого элемента, т.е. неэффективна. Изменение кода для проверки типа списка перед циклом поможет:

if attached {LINKED_LIST [INTEGER]} keys as integer_keys then
    ...
    across
        integer_keys as cursor
    loop
        tempI := cursor.item
    end
    ...
end

Если единственной операцией в цикле является присваивание, эквивалентный код должен взять только последний элемент списка:

...
if not keys.is_empty and then attached {LINKED_LIST [INTEGER]} keys as integer_keys then
    tempI := integer_keys.last
end
...

Вместо специализации код также можно обобщить, чтобы взять универсальный агент, которому будет передан ключ, а клиент предоставит процедуру для обработки ключа. Но этого может быть слишком много, в зависимости от цели решаемой вами задачи.

person Alexander Kogtenkov    schedule 27.10.2017