代码之家  ›  专栏  ›  技术社区  ›  Halona

有办法打印单元实例名吗?

  •  1
  • Halona  · 技术社区  · 6 年前

    我做了一个普通的 agent 将在环境中多次实例化:

    unit agent_u {
        monitor : monitor_u is instance;
    };
    

    监视器会打印一些消息,例如:

    unit monitor_u {
        run() is also {
            message(LOW, "Hello monitor!");
        };
    };
    

    我想在监视器的消息中添加哪个代理实例打印了它们。例如,对于环境:

    extend sys {
        first_agent : agent_u is instance;
        second_agent : agent_u is instance;
    };
    

    理想的输出应该是这样的:

    first_agent: Hello monitor!
    second_agent: Hello monitor!
    

    我在反射API中找不到与实例名相关的任何内容…有没有办法在e中打印实例名?

    谢谢你的帮助

    2 回复  |  直到 6 年前
        1
  •  2
  •   Nils    6 年前

    使用message()打印将已经包含实例指针,在您的情况下如下:

    [0] agent_u-@1: Hello monitor!
    [0] agent_u-@2: Hello monitor!
    

    你可以通过这些来区分@ 全国矿工联盟

    或者在消息中包含“me.e_path()”,这将给出完整的实例路径:

         message(LOW, me.e_path(), ": Hello monitor!");
    
    [0] agent_u-@1: sys.first_agent.monitor: Hello monitor! 
    [0] agent_u-@2: sys.second_agent.monitor: Hello monitor!
    
        2
  •  1
  •   Yuri Tsoglin    6 年前

    不确定“实例名”到底指的是什么,但有几点需要注意。

    有预定义的 e_path() 方法 any_unit

    结构和单元实例有一个唯一的标识符,由类型名和唯一编号组成,由 to_string() 方法。此唯一标识符已作为消息的一部分打印。

    此外,还可以使用预定义的钩子方法 create_formatted_message() ,最好与定义自己的新 message_format ,以自定义消息的打印方式。例如,您可以附加 路径() 如果希望格式化后的消息字符串自动出现在所有消息中,则返回。

    您也可以使用 short_name() 钩子为单元提供自己的符号名,这些符号名将出现在消息中,而不是 字符串()

    原则上,您还可以覆盖 字符串() 但这将产生比打印出的消息更大的影响。