【问题标题】:Eiffel: how do I get the type of a particular operand of a procedureEiffel:如何获取过程的特定操作数的类型
【发布时间】:2018-11-20 18:13:47
【问题描述】:

正如我在调试器中看到的那样,可以获取操作数和过程名称,有没有办法获取它?

  • PROCEDURE=>operands 返回一个可分离的,似乎仅在将操作数设置到代理中时才返回操作数
  • 我是否通过了任何 REFLECTOR 类,因为 PROCEDURE 类没有此功能,在这种情况下为什么呢?

似乎 estudio 可以访问 ROUTINE 客户端所没有的信息,为什么他是特权者?他在作弊吗?

【问题讨论】:

  • 如果您评估a_setter.open_operand_type (1),您将获得第一个打开操作数的类型ID。那么使用 REFLECTOR 将有助于获得“人类友好”的信息。例如(create {REFLECTOR}).type_of_type (a_setter.open_operand_type (1))
  • @Jocelyn 我也试过了,但是 open_operand_type 没有导出!!! {NONE} 在您看来,我有一个合格调用的功能对客户端类不可用。` 并且操作数是唯一可用于获取操作数 @runtime 的功能返回我 Void :-( 检查 ROUTINE 类...
  • @Jocelyn estudio watch 如何计算agent 值?所有信息都在那里可用!但不适用于 ROUTINE 客户端。听起来 estudio 是一个特权或作弊!
  • 我误解了你的问题,我以为你在问调试器。是的,调试器不受出口条款的限制(希望如此)。
  • 现在,ROUTINE 类提供的不多,因为暴露的越少,越有利于进化。现在,你为什么需要这些信息?出于任何很好的理由,有可能向 ROUTINE 添加新功能。

标签: introspection eiffel


【解决方案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 的开放参数的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多