e中的静态字段/方法

时间:2014-07-01 07:47:16

标签: e

我缺少哪些技术原因 e 没有静态字段/方法?

我抬头看了LRM,没有提到这样的事情。有一些解决方法(比如这个:http://www.specman-verification.com/index.php?entry=entry060612-105347),但我发现它并不是一个特别干净的方法,因为它没有很好地封装。

4 个答案:

答案 0 :(得分:1)

好问题。应该没有这样的技术原因没有它,并且将静态成员添加到 e 结构可能是个好主意。由于 e 的面向方面的特性,它的语义只需要仔细考虑,这与其他一些具有静态成员的语言无关(例如,一个需要回答的问题)是否可以扩展静态方法,例如,使用is also或不使用。

但是,它对我来说似乎并不是非常关键,因为静态字段实际上只不过是属于给定struct命名空间的全局字段(或方法,或任何其他类型的struct成员)。因此,即使没有静态成员,一个简单的解决方法是将此成员添加到global(或sys),并确保其名称具有前缀,使其明确“归属”到给定的结构。

但有一点很重要,它确实使静态成员不仅仅是global的成员。在 e 中,与C ++一样,有template种类型。 template的静态成员一方面会被给定模板实例类型的所有实例对象共享,但是在另一方面,将为每个模板实例单独存在(每个模板实例都是一个单独的结构)。

不确定上述链接中建议的基于端口的解决方法是否更好。我觉得它太过分了。

答案 1 :(得分:1)

实际上,在我之前的回答中,我错过了一个重点,它确实使静态成员不仅仅是global的成员。

e 中,与C ++一样,有template种类型。 template的静态成员一方面会被给定模板实例类型的所有实例对象共享,但是在另一方面,将为每个模板实例单独存在(每个模板实例都是一个单独的结构)。

答案 2 :(得分:1)

顺便说一句,静态结构成员被添加到Specman v15.2中的语言中。它们非常方便,特别是在静态的配置结构中:

extend packet_s {
  static max_address : uint = 0x1000;
};

-- Change max_address for all instances
on xxx { packet_s::max_address = 0x2000; };

无法生成静态字段,物理(%)或在子类型中使用。以下是来自teamspecman博客的一些评论:Static members in e

答案 3 :(得分:0)

我认为e还没有静态struct成员的主要原因是你总是拥有全局和sys单例以及特定模块的顶级单元(这意味着更好的封装),其中& #39;静'信息可以放置。除了在定义精确语义方面的一些复杂性之外,没有特殊的技术原因。

作为单元访问的语法糖,你总是可以用非常基本的单字宏包装它 - 它不会完全无缝,因为这个神奇的单词总是需要与原生可见的静态结构成员# 39;我',但仍然很容易使用。