Eiffel: как получить тип конкретного операнда процедуры

Как я вижу, в отладчике можно получить операнды и имя процедуры, есть ли способ его получить?

  • PROCEDURE=>operands возвращает отделяемый объект, который, кажется, возвращает операнды только тогда, когда они были установлены в агенте
  • Есть ли у меня проход через какой-либо класс REFLECTOR, потому что класс PROCEDURE не имеет этой функции, и в этом случае почему?

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

Похоже, что у estudio есть доступ к информации, а у ROUTINE клиента его нет, почему он привилегированный? он обманывает?


person Pipo    schedule 20.11.2018    source источник
comment
если вы оцените a_setter.open_operand_type (1), вы получите идентификатор типа первого открытого операнда. тогда использование REFLECTOR поможет получить удобную для человека информацию. на всякий случай (create {REFLECTOR}).type_of_type (a_setter.open_operand_type (1))   -  person Jocelyn    schedule 21.11.2018
comment
@Jocelyn Я тоже пробовал, но open_operand_type не экспортируется!!!! {NONE} по вашему мнению, у меня есть функция квалифицированного вызова, недоступная для клиентского класса.` и операнды, которые являются единственной доступной функцией для получения операндов, @runtime возвращает мне Void :-( Проверьте класс ROUTINE...   -  person Pipo    schedule 21.11.2018
comment
@ Джоселин, как часы студии вычисляют значение agent? там вся информация есть! но недоступен для ОБЫЧНОГО клиента. Похоже, estudio является привилегированным или жульничает!   -  person Pipo    schedule 21.11.2018
comment
Я неправильно понял ваш вопрос, я думал, вы спрашиваете об отладчике. И да, отладчик не ограничен пунктами экспорта (надеюсь).   -  person Jocelyn    schedule 22.11.2018
comment
Так вот, класс ROUTINE не дает многого, потому что чем меньше выставлено, тем лучше для эволюции. Теперь, зачем вам эта информация? По любой очень веской причине в ROUTINE можно добавить новые функции.   -  person Jocelyn    schedule 22.11.2018
comment
@Jocelyn, так что вы не видите никакого способа получить доступ к @runtime типу параметра данной подпрограммы?   -  person Pipo    schedule 22.11.2018
comment
Я думаю, вы можете использовать a_setter.generating_type, который возвращает ТИП, а затем использовать generic_parameter_type. А с помощью ROUTINE.open_count вы можете определить тип операндов открытия и закрытия.   -  person Jocelyn    schedule 22.11.2018
comment
Когда я начал использовать проектирование по контракту, я перестал пользоваться отладчиком.   -  person ctrl-alt-delor    schedule 22.11.2018
comment
@ctl-alt-deletor кажется, вы научились угадывать с первого раза, каким будет поведение используемого вами метода ... все же не мой случай!   -  person Pipo    schedule 23.11.2018


Ответы (1)


В следующем коде показано, как получить информацию об открытых типах аргументов объекта подпрограммы:

        p: ROUTINE -- Routine object.
        t: TYPE [detachable ANY] -- Current open argument type.
    do
        p := agent (i: INTEGER; s: STRING)
            do
            end
        across
            1 |..| p.open_count as i
        loop
            t := p.generating_type.generic_parameter_type (1).generic_parameter_type (i.item)
            io.put_string (t.name)
            io.put_new_line
        end

Для меня код выше печатает

INTEGER_32
!STRING_8

Комментарии:

  1. p.open_count дает общее количество открытых аргументов.
  2. p.generating_type извлекает тип подпрограммного объекта.
  3. p.generating_type.generic_parameter_type (1) извлекает тип открытого объекта кортежа аргументов.
  4. Последний вызов generating_type извлекает тип открытого аргумента с индексом i.item.
person Alexander Kogtenkov    schedule 03.12.2018