Eiffel: работают ли методы преобразования в случае аргументов вызова агента?

Я вызываю процедуру с аргументом integer_64. Я реализовал класс WATT, который может создать его из INTEGER_64, и кажется, что выполнение останавливается, когда достигается эта точка, где я ошибаюсь?

Catcall detected for argument#1args': ожидал TUPLE [!WATT], но получил TUPLE [INTEGER_64]`

код_и_ситуация

Прикрепленный кейс (обновление)

На самом деле при проверке синтаксиса

attached {INTEGER_64} my_watt_object as l_int

введите здесь описание изображения

это тоже не проходит... это ожидаемое поведение?

На самом деле мне кажется, что семантические случаи одинаковы, которые должны подтвердить шаг соответствия... для меня (но, похоже, это не так для определения язык между соответствием/соответствием), в котором говорится

Соответствие и конвертируемость исключают друг друга, стр. 87

Действительно ли правило соответствия для типа, который определяет как convert тип, для другого типа, который является моим случаем от WATT до INTEGER_64?


person Pipo    schedule 20.11.2018    source источник
comment
Можете ли вы показать подпись set_from_json_object? Также измените размер столбцов сетки, чтобы имена объектов отображались полностью.   -  person Jocelyn    schedule 21.11.2018
comment
@Jocelyn, спасибо, надеюсь, на этот раз у тебя есть вся информация   -  person Pipo    schedule 21.11.2018
comment
Я забыл об этом посте, но на вашем первом снимке экрана вы вызываете обычный агент set_charge, который принимает WATT с аргументами INTEGER_64. Таким образом, сообщение о вызове ожидается. Для вашего обновления не применяется неявное преобразование для объекта test local (иначе было бы невозможно сделать if attached {INTEGER_64} ... elseif attached {WATT} ... ).   -  person Jocelyn    schedule 03.12.2018


Ответы (1)


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

Автоматическое преобразование во время выполнения не выполняется. Если вам нужен этот функционал, вам нужно реализовать его самостоятельно. В вашем примере, если тип аргумента — WATT, вам нужно явно вызвать преобразование из INTEGER_64 в WATT и передать объект типа WATT, а не INTEGER_64.

person Alexander Kogtenkov    schedule 03.12.2018
comment
Eiffel — компилируемый язык, интерпретатор, который оценивает типы, выполняет проверки и преобразования во время выполнения динамически, отсутствует. - person Alexander Kogtenkov; 03.12.2018